0

実際には .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();
        }

    }

}

私はこのコードを書きました。それを改善する良い方法はありますか?

4

4 に答える 4

0

関心のある列の幅が固定されている場合は、Excel で txt ファイルを開き、必要な場所に列の仕切りを配置できます。

Excel から csv としてエクスポートするのは簡単です。

于 2013-02-09T22:33:54.510 に答える
0

Scanner または StringTokenizer を使用することをお勧めします。ここに詳細な説明があります:

Scanner 対 StringTokenizer 対 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 ;
}
于 2013-02-09T21:44:25.823 に答える
0

固定幅であることが確実な場合は、フィールドの長さを計算してください。それ以外の場合は、単純なパーサーを作成することをお勧めします。正しい正規表現で幸運に恵まれるかもしれませんが、私の経験からすると、これには多くの試行錯誤が必要になる可能性があります。

それを解析するのはそれほど難しくないはずです...

于 2013-02-09T23:37:54.767 に答える
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;
}

これはあなたの質問に答えていますか?

于 2013-02-10T14:59:26.207 に答える