2016-05-14 3 views
1

Beanオブジェクトをcsv/txt形式のファイルに変換する際に問題が発生しました。私は明示的に新しい行の文字を '\ r \ n'と指定しています。これは、開いているcsvライターの行末の文字で上書きされます。オープンCSVライターを使用してJavaのBeanオブジェクトからtxtファイルを生成する際に余分なキャリッジリターンが追加されました

Windows上で動作しているローカルのtomcatサーバですべて正常に動作しています。つまり、各レコードの後に​​CRとLFが表示されています。しかし、Linuxベースマシンでcsv/txtファイルを作成しようとすると、 1つのレコードが​​で区切られているということです。つまり、アフターレコーディング後に余分なCRが追加されたということです.CRLFがほしいだけです。コードと構成は、ローカルマシンとリモートマシンで同じです。唯一の違いは、基盤となるOSです。その行のデータに問題はありません。

間違った出力ファイルにはscreenshotが添付されています(これは正確ではありませんが、約450行のうち正確ではありませんが、112行目に問題があります)。私は当初、問題のある特定の行に最後のゼロ(0)のキャリッジリターン文字がありますが、コードを深くチェックして、ゼロ(0)が固定値であるためデータに問題がないことを発見しました。どのデータベースからも選択されません。この修正値は、JAVA Constantファイルから読み取られ、各行ごとに同じです。問題があれば、それはすべての行にあったでしょう。

これはなぜ起こっているのですか?私はau.com.bytecode.opencsv.CSVWriter#writeAll(List allLines) APIを使用しています。このライターのデフォルト行の終了文字は"\n"(つまりLF)です。上で述べたように、これは私のコードで"\r\n"(i.e. CRLF)でオーバーライドしました。 WindowsとLinuxで異なる新しい行マーカーのいくつかのシステムデフォルト設定を選んでいますか?その場合、なぜ私が環境変数のすべてのタイプに対してrecordTerminatorを明示的に指定したのですか?それが事実なら、どうすればこの問題を解決できますか?本当にありがとうございます。ありがとうございました。

答えて

0

すでにCRを含む値を書き込んでいる可能性があります。

何も問題がなければ、行末を正規化し、読み書きするときに空白を自動的に切り詰めるので、解析/書き込みにはuniVocity-parsers 'を試してみてください。また、OpenCSVよりも高速です。

CsvParserSettings settings = new CsvParserSettings(); // you'll find many options here, check the tutorial. 
CsvParser parser = new CsvParser(settings); 
List<String[]> allRows = parser.parseAll(new File("/path/to/your.csv")); 

が開示:私はこのライブラリの作者だ

は、ここでそれを使用する方法の簡単な例です。オープンソースで無料(Apache V2.0ライセンス)です。

+0

返信いただきありがとうございます。私の前のコメントで述べたように、値は大丈夫です。私自身は同じ疑問を抱いていましたが、既に述べたように、値に余分なCRが含まれていた場合、すべての行に同じゼロを使用しているので、1行ではなくすべての行になります。 – user6328124

+0

親愛なるJeronimo Backes、特別なCRが(Linux環境で)単一行のみで追加される理由を教えてください。生成しているファイルがシステムによって読み取られていないため、このファイルは私たちと管理していない外部システムによって読み取られるため、ユーザーパーサーは使用できません。このようなシナリオを処理するための提案はありますか? – user6328124

+0

私はあなたが必要とするものが明確ではありません。あなたにとって問題のある動作と、期待される出力がどのようなものかを示す例を挙げてください。私はあなたを喜んで助けます。 –

関連する問題