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;
}