2016-09-18 19 views
-1

au.com.bytecode.opencsv.CSVReaderを使用してCSVファイルを読み取り、すべてのレコードを1つずつ印刷します。コードは奇妙な動作している。それは、単一のラインとして一緒に行のグループを印刷しています。その後、再び、それは正しく行の次のセットを印刷しています。フィールド内でCSVReaderが複数の行を1行で表示する理由

Link to the CSV File

は、上記のリンクからCSVファイルをダウンロードしてください。私のコードを検討しています最初の行は最初の非見出し行から内容が以下の行のすぐ上の行まで - として表示されます。

12/4/13:AOを最高財務責任者に変更しました。 "、" 07/18/2016 "、

また、私の最初のデータ行にはフィールドの1つに\"が含まれています。あなたはCntrl + Fを使って見つけることができます。フィールドから\を取り除いても問題ありません。ただ、コンテンツの下に持っている行の前の行:

12/4/13:最高財務担当役員にAOを変更「」2016" 年7月18日、

それは'12から新しい行を取っています/。 4/13 ......... '。また、その下の個々の行は完全に別々の行として扱われています。ご参考のため

コード:引用符文字が区切りコンテンツとみなされないように

csvReader reader = new CSVReader(new FileReader(fileNameWithLocation), ',', '"', 1); 

ColumnPositionMappingStrategy<DomainObj> mappingStrategy = 
          new ColumnPositionMappingStrategy<DomainObj>(); 

     mappingStrategy.setType(DomainObj.class);  

      String[] nextLine; 

      while ((nextLine = reader.readNext()) != null) 
      { 
        if (nextLine != null) 
        log.debug("Next line : " + Arrays.toString(nextLine)); 
      } 
+0

CSVファイルが無効であると表示されます。それはどのように作られたのですか?ここにリンクを投稿しないでください。データの関連部分を転記します。 – EJP

+0

私はファイルの内容を投稿すると、投稿が非常に不必要に大きく見えるようになると思います。また、ファイルは有効です。私はそれを確認した。 –

+0

私はファイルの内容を尋ねませんでした。私はデータの関連部分を追加します。これは1行だけで、ファイル全体ではありません。 – EJP

答えて

-1

バックスラッシュは、引用符をエスケープします。読者は"をそのバッファに入れ、次の引用符に当たるまで読書を続けます。

+0

rfcへのリンクhttps://www.ietf.org/rfc/rfc4180.txt – JEY

+0

ありがとう、@chrylis。私はあなたの声明に同意します。しかし、私のCSVの最初の行の後に一致する\ "がありません。ファイルの最後まで見つかったはずですが、驚くべきことに、いくつかの行の後に行が終了しています。 12/4/13:AOを最高財務責任者に変更しました。」、「07/18/2016」CSVをダウンロードして見ていただければ、私はあなたに感謝します:) –

+0

この答えは意味をなさない。引用符が内容の一部で区切り記号ではない場合、2番目の引用符が当たるまで、なぜそれを読むでしょうか? – EJP

0

また、opencsv support requestに掲載されています。

複数の行を読み込むのは、フィールドに新しい行があるデータを許可する必要があるからです。したがって、引用符で囲まれたデータでは、行の終わりに達し、フィールドを閉じていない(引用符を囲んでいない)と、opencsvは次の行を読み込み、その行を埋めます。それはあなたがリストしたものの上の行を見ることであなたのファイルのケースであることがわかります。一緒に置くと、実際には1行のデータが作成されます。

,, "440063"、 "DSH440063B"、 "39066"、 "DSH"、 "True"、 "01/01/2014"、 "10/01/2016"、 "12" ,,, "JOHNSON 「ジョンソンシティ医療センター」、「2205パビリオンドライブ」、「スイート101」、「キングスポート」、「TN」、「37660」、「4641」,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,。 「シェーン・E・ヒルトン」、「最高財務責任者」、「4234311038」、「トリッシュ・タナー」、「コンシューマー・ヘルス・スクール」ディレクター、「4233023532」,,「TRISH 「TANNER」、「システムサービスディレクター、薬局のサービス」、「10/10/2013」、「4233023532」,,,,,,,,,,,,「08/07/2015」、「False」,, "12/3/13 AO/SBOが十分に高いレベルであることがわかりません、pls chk 12/4/13:AOを最高財務責任者に変更しました。"、 "07/18/2016"、

上の行はpls chkで終わっていますが、closequoteはないので、opencsvは次の行を読み込みます。データの最初の部分を次の部分に追加します。

データの一部である引用符をエスケープする必要があります - 。したがって、\」

希望に役立ちます

スコット・コンウェイ:)

+0

私は、\ "これは行を追加し続けますが、これは終了するまでは起こるはずです\"と理解しました。ファイルが閉じていないので、ファイルの最後までファイルを1行にする必要があります。なぜそれが 'pls chk'で終わったのかを精緻化できれば、 CSVファイルを変更せずにこの問題を解決するには、理想的なコードを変更する必要がありますか?CSVReader reader = new CSVReader(new FileReader() fileNameWithLocation)、 '、'、 '"'、 '\ 0'、1); –

関連する問題