16

opencsvを使用してcsvファイルを読み取っています。

私はの最初の行を無視しています。csvファイルはタブで区切られ、いくつかの値は二重引用符で囲まれています。

'\'文字を含む列の値を読み取ると、問題が発生します。これは値から削除されます。

reader = new CSVReader(new FileReader(exchFileObj),'\t','"',1);

たとえば、元のファイルの場合:

address = 12\91buenosaires   

次のようになります。

address = 1291buenosiares

csvreaderが生成する文字列配列。'\'文字も読み取れるように変更するにはどうすればよいですか?

4

4 に答える 4

24

同じ問題が発生し、csvファイルに表示されないことを保証できる別の文字が見つかりませんでした。ただし、sourceforgeの投稿によると、明示的なコンストラクターを「\ 0」とともに使用して、エスケープ文字が不要であることを示すことができます。

http://sourceforge.net/tracker/?func=detail&aid=2983890&group_id=148905&atid=773542

CSVParser parser = new CSVParser(CSVParser.DEFAULT_SEPARATOR, CSVParser.DEFAULT_QUOTE_CHARACTER, '\0', CSVParser.DEFAULT_STRICT_QUOTES);

私は少し大雑把なテストをしました、そしてこれはうまくいくようです、少なくともバックスラッシュは確かにそれを通り抜けます。

于 2011-12-19T19:27:15.630 に答える
3

CSVReaderには、使用するエスケープ文字を設定できるパーサービルダーもあります。これを使用し、エスケープ文字を使用しないものに設定すると、入力に円記号が含まれます。

于 2011-05-15T12:55:22.800 に答える
2

@JMMの回答に加えて、CSVReaderのコンストラクターでこの作成されたCSVParserを使用する必要があります。使用可能なコンストラクターは次のとおりです。

public CSVReader(Reader reader, int line, CSVParser csvParser)

行を0に設定して、何もスキップしないようにすることができます

于 2016-04-13T15:16:16.117 に答える
2

注:この回答の解決策は、RFCに依存することにより、準拠したリーダーを大まかに構成するという点で、3つの選択肢よりも優れていると思います。他の答えは、エスケープ文字の構成の詳細に入ります。それは機能しますが、ホワイトボックスソリューションのように見えます。

デフォルトでは、OpenCSVのリーダーはライターに準拠していません。リーダーはRFCに準拠していません。それがなぜなのか私に聞かないでください。私はそれがあなたと同じように厄介で困惑していると思うからです。

解決策は、RFC準拠のパーサーを使用してCSVReaderを構成することです。

RFC4180Parser rfc4180Parser = new RFC4180ParserBuilder().build();
CSVReaderBuilder csvReaderBuilder =
  new CSVReaderBuilder(new StringReader(writer.toString()))
      .withCSVParser(rfc4180Parser);
reader = csvReaderBuilder.build();

上記のソースページは次のとおりです。

于 2019-08-02T15:28:20.223 に答える