web-dev-qa-db-ja.com

生成されたcsvファイル内の不要な二重引用符

以下の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」

これらの二重引用符が追加された場所から取得できません。

29
Edward

これは私のために働いた

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

CSVWriter javadoc を参照してください

46
Shamis Shukoor

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

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

  2. 引用符で囲まれたくないので、カンマ、引用符、改行が埋め込まれている場合、CSVは無効になることを理解しています

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

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

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

P Sherman, 42 Wallaby Way,
Sydney, AUSTRALIA

一方、それが適切に引用されていれば、それは明らかだろう、すなわち.

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

参考までに、 RFC418 (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"
14
James Bassett

生成されたCSVファイルの値に引用符が必要ない場合は、次の方法でCSVWriterオブジェクトを作成する必要があります。

CSVWriter writer = new CSVWriter(new FileWriter(filePath),
    CSVWriter.DEFAULT_SEPARATOR,
    CSVWriter.NO_QUOTE_CHARACTER,
    CSVWriter.DEFAULT_ESCAPE_CHARACTER,
    CSVWriter.RFC4180_LINE_END);

キーはCSVWriter.NO_QUOTE_CHARACTER。他のコンストラクタパラメータの値をカスタマイズできます。

5
giainel

private void writeFile(String fileAbsolutePath、ListcsvLines)が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);

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

1
user989383

.csvファイルに表示されているデータに直面している状況があり、両側に3つの引用符があります。これは、Excelでデータが引用されているためです。 2番目に.csvファイルを作成し、開いて必要な引用をさらに表示しました。ネット上で多くの検索を行った後、次のようにいくつかのコードを見つけて調整しました。

 Public Sub OutputQuotedCSV()
 Const QSTR As String = ""
 Dim myRecord As Range
 Dim myField As Range
 Dim nFileNum As Long
 Dim sOut As String

   nFileNum = FreeFile
   Open "TheNameOfYourFile.txt" For Output As #nFileNum
   For Each myRecord In Range("A1:A" & _
          Range("A" & Rows.Count).End(xlUp).Row)
      With myRecord
         For Each myField In Range(.Cells(1), _
             Cells(.Row, 256).End(xlToLeft))
           'I didn't want my Header Row touched but wanted it added into the csv file
           'There's probably an easier way but this worked perfectly for me
            If myField.Text = "HEADER 1" Then 
                        sOut = sOut & QSTR & _
                        Replace(myField.Text, QSTR, QSTR & QSTR) & "  "
                    ElseIf myField.Text = "HEADER 2" Then
                        sOut = sOut & QSTR & _
                        Replace(myField.Text, QSTR, QSTR & QSTR) & "  "
                    ElseIf myField.Text = "HEADER 3" Then
                        sOut = sOut & QSTR & _
                        Replace(myField.Text, QSTR, QSTR & QSTR) & "  "
                    ElseIf myField.Text = "HEADER 4" Then
                        sOut = sOut & QSTR & _
                        Replace(myField.Text, QSTR, QSTR & QSTR) & "  "
                    ElseIf myField.Text = "HEADER 5" Then
                        sOut = sOut & QSTR & _
                        Replace(myField.Text, QSTR, QSTR & QSTR) & "  "
                    ElseIf myField.Text = "HEADER 6" Then
                        sOut = sOut & QSTR & _
                        Replace(myField.Text, QSTR, QSTR & QSTR) & "  "
                    Else
               'I didn't want my first column to start with "," so I added the code below
                        If myField.Cells.Column = 1 Then
                            sOut = sOut & QSTR & _
                            Replace(myField.Text, QSTR, QSTR & QSTR) & QSTR
                        Else
                            sOut = sOut & "," & QSTR & _
                            Replace(myField.Text, QSTR, QSTR & QSTR) & QSTR
                        End If
                    End If
            Next myField
            Print #nFileNum, Mid(sOut, 1)
            sOut = Empty
        End With
    Next myRecord
    Close #nFileNum
End Sub

このコードは余分な引用符を取り除き、データの最初と最後にデータを単一引用符だけで残します。これが誰かの助けになることを願っています。私のフォーマットで何か間違ったことをしたり、データを正しく表示しなかった場合は、ご容赦ください。私はただ他人を助けようとしています。これは私のコードではないことを覚えておいてください。私はちょうど私のためにそれを機能させたし、他の人が私がここで達成したものを得ようとしていると思う。元のコードはここにあります http://www.mcgimpsey.com/Excel/textfiles.html#csvwithquotes

0
Vineshan

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

例:

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

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

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

A2 | G A A | Thilina | 9022V | 1 | 2 | 3 | 4 | "Rubasingha" | 'Abc | MATARA "|' No '| 2012 | 1668.88

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

しかし、 'Abcを使用する場合-単一引用符のみを開く-これも正常に動作します

しかし、MATARA "OR" MATARA-ここには二重引用符が1つあります-私のこれは、オープン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), '|','^');

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

0