35

以下のJavaコードを使用してCSVファイルを作成しました。

String csv = rs.getString("UPLOAD_FOLDER_PATH")+".csv";
CSVWriter writer = new CSVWriter(new FileWriter(csv));
String [] filevalues = new String[filevaluesarray.size()];

filevalues=filevaluesarray.toArray(filevalues);

writer.writeNext(filevalues);

writer.close();

CSVファイルを取得していますが、ファイルの内容に不要な二重引用符が含まれています。

例えば。「ABC」、「123」、「KDNJ」

これらの二重引用符が追加された場所からはわかりません。

4

8 に答える 8

57

これは私のために働いた

CSVWriter writer = 
    new CSVWriter(new FileWriter(csv), ',', CSVWriter.NO_QUOTE_CHARACTER);

CSVWriter javadocを参照してください

于 2012-12-20T09:57:15.593 に答える
16

おそらく、「不要な」引用符の意味を明確にする必要があります。

  1. すべてを引用したくない、埋め込まれたコンマ、引用符、改行を含むフィールドのみ(すべてを引用する必要はなく、ファイルが大きくなる)、または

  2. 引用符は必要ありません。カンマ、引用符、改行が埋め込まれていると、CSVが無効になることを理解しています。

これが最初のオプションである場合、opencsvはこれをサポートしていません。すべてを引用するか、何も引用しません。必要な場合にのみ引用するオープンソースのCSVライブラリが必要な場合は、 Super CSVを参照してください(必要に応じてすべてを引用することもできます)。

2番目のオプションの場合は、Sheldonの回答を使用してください。ただし、CSVにカンマ、引用符、改行が埋め込まれていると、CSVが無効になることに注意してください。

たとえば、CSVファイルを読んでいる場合、次のファイルが実際には2つのフィールドを持つ単一のレコードであることをどのように知ることができますか?

P Sherman, 42 Wallaby Way,
Sydney, AUSTRALIA

それが適切に引用された場合、それは明らかです、すなわち

P Sherman, "42 Wallaby Way,
Sydney, AUSTRALIA"

参考までに、 RFC4180(CSVのMIMEタイプ定義)からの引用に関連するルールは次のとおりです。

5 各フィールドは二重引用符で囲まれている場合とされていない場合があります(ただし、Microsoft Excelなどの一部のプログラムでは、二重引用符をまったく使用していません)。フィールドが二重引用符で囲まれていない場合、二重引用符はフィールド内に表示されない場合があります。例えば:

   "aaa","bbb","ccc" CRLF
   zzz,yyy,xxx

6 改行(CRLF)、二重引用符、およびコンマを含むフィールドは、二重引用符で囲む必要があります。例えば:

   "aaa","b CRLF
   bb","ccc" CRLF
   zzz,yyy,xxx

7 フィールドを囲むために二重引用符を使用する場合、フィールド内に表示される二重引用符は、その前に別の二重引用符を付けてエスケープする必要があります。例えば:

   "aaa","b""bb","ccc"
于 2012-12-21T01:24:19.210 に答える
1

private void writeFile(String fileAbsolutePath , ListcsvLines) throws IOException{

    final char csvDelimeter = ',';
    CSVWriter csvWriter = new CSVWriter(new FileWriter(new File(fileAbsolutePath)),csvDelimeter,CSVWriter
                                                                                               .NO_QUOTE_CHARACTER);
    CSVParser parser = new CSVParser();

    for(String csvLine  : csvLines){
        String[] csvVals = parser.parseLine(csvLine);
        csvWriter.writeNext(csvVals);
    }
    csvWriter.flush();
}

呼び出し: writeFile(fileAbsolutePath,csvLinesList);

シャミスの答えの実例、それは私にとってはうまくいきます。

于 2016-03-07T08:22:02.433 に答える
0

オープンcsvでも同じ問題に直面しており、問題を修正するためにエスケープ文字を使用しています。

例:

CSVReader csvReader = new CSVReader(new FileReader(fileName), seprator,escaped_character);

ここで開いているcsvのデフォルトでは、escape_characterとして二重引用符を使用します(私の知る限り)

私の場合、セパレーターをパイプ記号 (|) として使用します

A2|GAA|Thilina|9022V|1|2|3|4|"Rubasingha"|'Abc|MATARA"|'いいえ'|2012|1668.88

ここで"Rubasingha"は二重引用符を開閉し、'No'も一重引用符を開閉します。これら2つは、デフォルトのオープンcsvで完全に機能します

しかし、'Abcを使用する場合- 一重引用符のみを開いてください - これも問題なく動作します

しかし、MATARA" OR "MATARA - ここには二重引用符が 1 つあります - 私の場合、open csv を使用して CSV を読み取るときにエラーが発生します

問題を修正するには、このページを参照します ( http://cs.swan.ac.uk/~csbob/teaching/java/JavaDemoNetbeans/opencsv-2.3/doc/ )

独自の区切り文字と引用符文字を提供するコンストラクターがあります。セパレーターにタブを使用しているとします。次のようなことができます。

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t');

また、エスケープ文字を二重引用符ではなく単一引用符で囲んだ場合は、3 つの引数のコンストラクターを使用できます。

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'');

ファイルの後半までコンテンツが開始されないことがわかっている場合は、ファイルの最初の数行をスキップすることもできます。したがって、たとえば、次のようにして最初の 2 行をスキップできます。

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'', 2);

そのため、二重引用符をエスケープ文字として使用せずに、デフォルトのエスケープ文字を (^) 記号に変更します。

CSVReader csvReader = new CSVReader(new FileReader(fileName), '|','^');

これが私が問題を解決する方法です。ありがとう

于 2014-01-07T07:23:29.843 に答える