11

私は次のようにresultSetからファイルを入力しています:

      while(rs.next()){

          String[] entries = new String[3];
          entries[0] = rs.getString(1);
          entries[1] = ",";
          entries[2] = rs.getString(2);

          println("entries : "+entries);
          writer.writeNext(entries);

      }

Excelファイルを開くと、値の前後に二重引用符が含まれています。したがって、データベースから読み取って.csvファイルに書き込むと、test1、test2、test3は「test1」、「test2」、「test3」になります。

テキストをファイルに書き込むが、引用符を含めないようにするにはどうすればよいですか?

エントリをコンソールに印刷すると、二重引用符が印刷されないため、どこに追加されているのかわかりません。

4

10 に答える 10

23

Mattenの答えを拡張するために、CSVWriterの組み込み文字を使用してを指定しますquotechar。したがって、ライターは次のようになります。

CSVWriter writer = new CSVWriter(new FileWriter(fileName), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
于 2014-03-23T19:54:41.553 に答える
6

この質問は、誰かがOpenCSVを探して問題を引用すると、Googleの結果の最初の場所に表示されるので、ここに新しいソリューションを追加します。

私はバージョン4.6を使用していますが、区切り文字を含む全体で引用符を保持しながら、引用符をスキップすることは確かに可能です。

サンプルコード:

List<SomeCsvEntryTO> csvEntries = new ArrayList<>();
csvEntries.add(new SomeCsvEntryTO("sdf1", "sdf2"));
csvEntries.add(new SomeCsvEntryTO("hgh1", "hgh2;hghgh2"));

Writer writer = new FileWriter(filePath);
StatefulBeanToCsv<SomeCsvEntryTO> csvWriter = new StatefulBeanToCsvBuilder<SomeCsvEntryTO>(writer)
        .withSeparator(';')
        .withApplyQuotesToAll(false)
        .build();
csvWriter.write(csvEntries);
writer.close();

SomeCsvEntryTO:

public class SomeCsvEntryTO{

   @CsvBindByName(column = "sample1colname")
   private String sample1;

   @CsvBindByName(column = "sample2colname")
   private String sample2;
}

上記のように、私は区切り文字としてセミコロンを使用しており、quotecharは変更していません。に変更するだけwithApplyQuotesToAllですfalse

これにより、次の結果が生成されます。

SAMPLE1COLNAME;SAMPLE2COLNAME
sdf1;sdf2
hgh1;"hgh2;hghgh2"
于 2019-10-16T11:03:28.180 に答える
4

アップデート(2019年10月16日):これは、OpenCSVの新しいバージョンで可能になりました。Sikorの答えをご覧ください。


TL; DROpenCSVv2.3では実行できません。ただし、 CommonsCSVを使用できます。

OpenCSV(v2.3)は、引用符が不要な場合に引用符をオフにする安全な方法を提供していないようです。通常、区切り文字または行末文字が含まれていない値には引用符は必要ありません。

NO_QUOTE_CHARACTER一部の人が示唆しているように使用する:

CSVWriter writer = new CSVWriter(new FileWriter("data.csv"), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER);
String[] someData = new String[] {"Black and white", "Red, yellow and blue"};
writer.writeNext(someData);

次のように誤ったCSV表現を生成します。

Black and white,Red, yellow and blue

必要な場合にのみ引用符を使用する、このデータのより有効な表現は次のとおりです。

Black and white,"Red, yellow and blue"

Commons CSVを使用したことQuoteMode.MINIMALはありませんが、次の機能を介してこの機能を提供しているようです。

区切り文字、引用符文字、または行区切り文字内の任意の文字などの特殊文字を含む引用符フィールド。

于 2015-02-11T10:20:02.497 に答える
3

はい。CSVReaderと同じセマンティクスに従う同じパッケージにCSVWriterがあります。たとえば、タブ区切りのファイルを作成するには、次のようにします。

CSVWriter writer = new CSVWriter(new FileWriter("yourfile.csv"), '\t');
// feed in your array (or convert your data to an array)
String[] entries = "first#second#third".split("#");
writer.writeNext(entries);
writer.close();

独自の引用符を使用したい場合は、3引数バージョンのコンストラクターを使用できます。これは、引用符を使用します(または、CSVWriter.NO_QUOTE_CHARACTERを自由に渡してください)。

生成されたファイルで使用されるラインターミネータをカスタマイズすることもできます(これは、Linux WebアプリケーションからWindowsクライアントにエクスポートする場合に便利です)。この目的のためのコンストラクター引数があります。

于 2016-06-23T21:22:57.007 に答える
1

ライターのコンストラクターコードを使用すると、エスケープ文字(quotechar)を指定できます。

CSVWriter(Writer writer, char separator, char quotechar)

これが間違っている場合は、エスケープ文字を使用した別のコンストラクターがあります:-)

CSVWriter(Writer writer, char separator, char quotechar, char escapechar)
于 2013-03-12T16:39:48.003 に答える
1

ファイルに書き出すときにNO_QUOTE_CHARACTERコンストラクターと適切なエンコードを使用する方法については、次のリンクを参照してください。

https://stackoverflow.com/a/29362439/1454926

于 2015-03-31T07:24:20.260 に答える
0

バージョン5.x以降で機能するものは次のとおりです

import static com.opencsv.ICSVParser.*;

...
new CSVWriter(writer, DEFAULT_SEPARATOR, NO_QUOTE_CHARACTER, DEFAULT_ESCAPE_CHARACTER, DEFAULT_LINE_END)
于 2020-10-06T15:14:57.350 に答える
0

このパターンを使用して、二重引用符を防止します(5.3バージョンでチェック済み)

CSVWriter writer = new CSVWriter(new FileWriter(filename), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);
于 2020-12-09T20:17:55.850 に答える
0

長い間、多くの実用的な答えがありましたが、2021年とv5の時点で、私の目に最もクリーンなソリューションは、定義された定数を持つビルダーを使用することです。これにより、固定コンストラクターを使用する場合よりも、CsvWriterをより詳細に制御できます。

import static com.opencsv.ICSVWriter.*;

CSVWriterBuilder builder = new CSVWriterBuilder(new FileWriter("yourfile.csv"));
ICSVWriter csvWriter = builder
      .withQuoteChar(NO_QUOTE_CHARACTER)
      .build();
csvWriter.writeAll(rs, true);
于 2021-04-07T09:22:23.660 に答える
-1

Constructor@Mattenで言及されているようにを使用でき、それとともに、の他のwriteAll ()を使用できCSVWriterます。

OpenCSVは、SQLテーブルからCSVに直接データをダンプするためのサポートも提供します。このためには、ResultSetオブジェクトが必要です。次のAPIを使用して、ResultSetからCSVにデータを書き込むことができます。

java.sql.ResultSet myResultSet = getResultSetFromSomewhere();
writer.writeAll(myResultSet, includeHeaders);

このwriteAll(ResultSet, boolean)方法はこれに利用されます。最初の引数は、CSVファイルResultSetに書き込む引数です。そして2番目の引数は、ヘッダー列(テーブル列名)をファイルに書き込むかどうかを表します。boolean

于 2013-03-12T16:44:39.013 に答える