实际上我有一个.rtf文件,我试图创建一个csv文件。搜索时,我看到我已将其转换为纯文本,然后转换为csv文件。但是现在我有点坚持逻辑。我不知道应该向前推进什么。
我有以下数据要转换为csv。
输入:
Search Target Redmond40_MAS Log Written 01/18/2013 9:13:19 Number of attempts 1
Search Target Redmond41_MAS Log Written 01/19/2013 9:15:16 Number of attempts 0
输出:
Search Target,Log Written,Number of attempts
Redmond40_MAS,01/18/2013 9:13:19,1
Redmond41_MAS,01/19/2013 9:15:16,0
如果有任何分隔符,那么我会这样做但是在这种情况下我知道是“键”,即标题值,但不知道如何提取相应的内容。
任何建议都会有所帮助。
import java.io.*;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.rtf.RTFEditorKit;
public class Rtf2Csv {
public static void main(String[] args) {
RTFEditorKit rtf = new RTFEditorKit();
Document document = rtf.createDefaultDocument();
try {
FileInputStream fi = new FileInputStream("test.rtf");
rtf.read(fi, document, 0);
} catch (FileNotFoundException e) {
System.out.println("File not found");
} catch (IOException e) {
System.out.println("I/O error");
} catch (BadLocationException e) {
}
String output = "Search Target,Log Written,Number of attempts";
try {
String text = document.getText(0, document.getLength());
text = text.replace('\n', ' ').trim();
String[] textHeaders = text
.split("===================================================================================");
String[] header = { "Search Target", "Log Written",
"Number of attempts"};
System.out.println(textHeaders.length);
int headLen = header.length;
int textLen = textHeaders.length;
for (int i = 0; i < textLen; i++) {
String finalString = "";
String partString = textHeaders[i];
for (int j = 0; j < headLen; j++) {
int len = header[j].length();
if (j + 1 < header.length)
finalString += partString.substring(
partString.indexOf(header[j]) + len,
partString.indexOf(header[j + 1])).trim()
+ ",";
else
finalString += partString.substring(
partString.indexOf(header[j]) + len).trim();
}
output += "\n" + finalString;
}
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
FileWriter writer = new FileWriter("output.csv");
writer.append(output);
writer.flush();
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我写了这段代码。有没有更好的方法来改善它?
答案 0 :(得分:0)
我建议使用Scanner或StringTokenizer。这里有一个深入的解释:
Scanner vs. StringTokenizer vs. String.Split
这样的事情应该这样做:
StringTokenizer s = new StringTokenizer("Search Target Redmond40_MAS Log Written 01/18/2013 9:13:19 Number of attempts 1"
);
String out = new String();
while (s.hasMoreTokens()) {
out = s.nextToken() + "," + out ;
}
答案 1 :(得分:0)
如果您感兴趣的列具有固定宽度,则可以在Excel中打开txt文件并将列分隔符放在所需的位置。
从Excel导出为csv会很简单。
答案 2 :(得分:0)
如果您确定它是固定宽度,那么只需计算字段的长度。否则,我建议写一个简单的解析器。你可能会对正确的正则表达式感到幸运,但根据我的经验,这可能是很多的错误。
解析它应该不会太难......
答案 3 :(得分:0)
如果您想逐行阅读,可以使用以下内容:
public int countLines(File inFile)
{
int count = 0;
Scanner fileScanner = new Scanner(inFile);
while(fileScanner.hasNextLine()) //if you are trying to count lines
{ //you should use hasNextLine()
fileScanner.nextLine() //advance the inputstream
count++;
}
return count;
}
这会回答你的问题吗?