LoginSignup
2
2

More than 5 years have passed since last update.

ASS形式のカラオケタグを読み込む

Last updated at Posted at 2016-02-21

RhythmicaLylicsでtxt2ass出力したカラオケタグを読み込むプログラム。
この後aviutlで読み込めるexo形式での出力を予定。

  • 正規表現とテキスト処理難しい。
public class ass2exoJ {
    private static List<Tag> wordList;
    private static List<Tag> rubyStrList;



    public static void main(String args[]){
        String fileName="aaaaaaa.kra";
        File file = new File(fileName);

        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file),"MS932"));
            String str;
            wordList=new ArrayList<Tag>();
            rubyStrList=new ArrayList<Tag>();
            str=br.readLine();
            while(str != null){
                //()括りのルビ部を抜き出す
                Pattern pattern = Pattern.compile("\\(.+?\\)");
                Matcher matcher = pattern.matcher(str);
                List<String> rubyList = new ArrayList<String>();
                List<String> charList = new ArrayList<String>();
                String rubyStr;
                while (matcher.find()) {
                    rubyStr=matcher.group().replace("(","");
                    rubyStr=rubyStr.replace(")","");
                    rubyList.add(rubyStr);
                }
                for (int i=0;i<rubyList.size();i++) {
                    //ルビをタイムコードを含めて除去;
                    //System.out.println(rubyList.get(i));
                    str=str.replace(rubyList.get(i), "");
                }
                //全半角スペースを除去
                str=str.replaceAll(" ", "");
                str=str.replaceAll(" ", "");

                Pattern pattern2 = Pattern.compile("\\[.+?\\]..?\\[.+?\\]");
                Matcher matcher2 = pattern2.matcher(str);
                while (matcher2.find()) {
                    charList.add(matcher2.group());
                }
                rubyStrList=addTagList(rubyList, rubyStrList);
                wordList = addTagList(charList,wordList);
                str = br.readLine();
            }
            for(int i=0;i<wordList.size();i++){
                if(wordList.get(i).lineEndFlg==0){
                    System.out.print("["+wordList.get(i).beginTime+"]"+""+wordList.get(i).word+"["+wordList.get(i).endTime+"]");
                }else{
                    System.out.println("["+wordList.get(i).beginTime+"]"+""+wordList.get(i).word+"["+wordList.get(i).endTime+"]");
                }

            }
            for(int i=0;i<rubyStrList.size();i++){
                if(rubyStrList.get(i).lineEndFlg==0){
                    System.out.print("["+rubyStrList.get(i).beginTime+"]"+""+rubyStrList.get(i).word+"["+rubyStrList.get(i).endTime+"]");
                }else{
                    System.out.println("["+rubyStrList.get(i).beginTime+"]"+""+rubyStrList.get(i).word+"["+rubyStrList.get(i).endTime+"]");
                }

            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }



    public static List<Tag> addTagList(List<String> list,List<Tag> wordList){
        for (int i=0;i<list.size();i++) {
            Tag tag = new Tag();
            String str;
            //タイムコードが3個以上含まれている場合
            if(list.get(i).split("\\[").length - 1>2){
                int index=list.get(i).indexOf("]");
                //文字列を抜き出して要素入れ替え
                str = list.get(i).substring(index+1);
                tag.beginTime=str.substring(str.indexOf("[")+1, str.indexOf("]"));
                tag.word=str.substring(str.indexOf("]")+1,str.lastIndexOf("["));
                tag.endTime=str.substring(str.lastIndexOf("[")+1, str.lastIndexOf("]"));
            }else{
                str = list.get(i);
                tag.beginTime=str.substring(str.indexOf("[")+1, str.indexOf("]"));
                tag.word=str.substring(str.indexOf("]")+1,str.lastIndexOf("["));
                tag.endTime=str.substring(str.lastIndexOf("[")+1, str.lastIndexOf("]"));
            }
            if(i==list.size()-1){
                tag.lineEndFlg=1;
            }else{
                tag.lineEndFlg=0;
            }
            wordList.add(tag);
        }
        return wordList;
    }
}

public class Tag {
    public String beginTime;
    public String endTime;
    public String word;
    public int lineEndFlg;

}
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2