2016-12-21 23 views
1

csvファイル(バランスシート)のフォルダを解析しようとしていて、値から行名を分離しようとするまで、すべてがスムーズに上がっています。Javaのcsvファイルの解析に問題があります

前の行の最後のセルが、次の行の最初のセル(列Aの行名)と結合しているように見えます。ここで

File path = new File("/Users/Zack/Desktop/JavaDB/BALANCESHEETS"); 
    for(File file: path.listFiles()) { 
     if (file.isFile()) { 
      String fileName = file.getName(); 
      String ticker = fileName.split("\\_")[0]; 
      if (ticker.equals("ASB") || ticker.equals("FRC")) { 
       if (ticker.equals("ASB")) { 
        ticker = ticker + "PRD"; 
       } 
       if (ticker.equals("FRC")) { 
        ticker = ticker + "PRD"; 
       } 
      } 

      Reader reader = new BufferedReader(new FileReader(file)); 
      StringBuilder builder = new StringBuilder(); 

      int c; 
      while ((c = reader.read()) != -1) { 
      builder.append((char) c); 
      } 

      String string = builder.toString(); 

      ArrayList<String> stringResult = new ArrayList<String>(); 

      if (string != null) { 
       String[] splitData = string.split("\\s*,\\s*"); 
       for (int i = 0; i <splitData.length; i++) { 
        if (!(splitData[i] == null) || !(splitData[i].length() ==0)) { 
         stringResult.add(splitData[i].trim()); 
        } 
       } 
      } 



      for (int i = 0; i < stringResult.size(); i++) { 
       int cL = stringResult.get(i).length(); 

       for (int x = 0; x < cL; x++) { 
        if (Character.isLetter(stringResult.get(i).charAt(x))) { 
         System.out.println("index: " + i); 
         System.out.println(stringResult.get(i)); 
         break; 
        } 
       } 

      } 

https://postimg.org/image/a9qc1qggz/ https://postimg.org/image/mvna7p7s3/

にこの問題を解決する方法上の任意のアイデアを何が起こっているかのいくつかの写真がありますか?

スプレッドシートの行名の前にスペースがあることに気付きましたが、これは問題の一部である可能性があります。

+4

既存のライブラリを使用するのではなく、独自のCSVパーサーを作成する特別な理由はありますか? –

+2

Zack csvReaderクラスを使用することを強くお勧めします。たぶんhttp://opencsv.sourceforge.net/ –

+0

@マット本当の理由は本当に私はそれを試してみたかった。 – Zack

答えて

1

問題は、ここで、ファイルに読んでいるところから来ている:

Reader reader = new BufferedReader(new FileReader(file)); 
StringBuilder builder = new StringBuilder(); 

int c; 
while ((c = reader.read()) != -1) { 
    builder.append((char) c); 
} 

String string = builder.toString(); 

これは、改行文字(複数可)を含む単一の文字列に変換するすべての文字を読み取ります。文字列を分割すると、改行文字で分割されていないので、表示されている文字列になります。

すでに述べたように、すでに存在する多くのcsvパーサの1つを使用することを強くお勧めします。

シンプル(醜い)の修正も改行で分割することです。より良い修正はBufferedReaderreadLine()メソッドを使用することです。

!=はあなたの友人です。

0

Erwinがコメントに記載したように、あなたが分割しているパターンは、その周りの空白でカンマを探します。それは、データが空白のカンマ空白または改行で区切られることを知っているので、あなたのデータがどのようなフォーマットになるかを知っているように見えます。私には入力を"\\s*,\\s*|$"に変更する必要があると思われます。これはそれを表す正規表現です。同様に、データの中には空白が含まれていないことを前もって知っておく必要があります。

関連する問題