Java 生成的csv文件中不需要的双引号
我使用以下Java代码创建了一个CSV文件:Java 生成的csv文件中不需要的双引号,java,csv,file-io,opencsv,supercsv,Java,Csv,File Io,Opencsv,Supercsv,我使用以下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.
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”
我不知道这些双引号是从哪里加上去的。这对我很有用
CSVWriter writer =
new CSVWriter(new FileWriter(csv), ',', CSVWriter.NO_QUOTE_CHARACTER);
请参阅您可能应该澄清“不需要的”引号的含义
P Sherman, 42 Wallaby Way,
Sydney, AUSTRALIA
然而,如果它被正确引用,这将是显而易见的,即
P Sherman, "42 Wallaby Way,
Sydney, AUSTRALIA"
仅供参考,以下是有关引用的规则(CSV的MIME类型定义)
5每个字段可以用双引号括起来,也可以不用双引号括起来(但是
有些程序,如Microsoft Excel,不使用双引号
完全没有)。如果字段没有用双引号括起来,则
双引号不能出现在字段内。例如:
"aaa","bbb","ccc" CRLF
zzz,yyy,xxx
"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx
"aaa","b""bb","ccc"
6包含换行符(CRLF)、双引号和逗号的字段
应该用双引号括起来。例如:
"aaa","bbb","ccc" CRLF
zzz,yyy,xxx
"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx
"aaa","b""bb","ccc"
7如果使用双引号括起字段,则使用双引号
出现在字段中时,必须在其前面加上
另一个双引号。例如:
"aaa","bbb","ccc" CRLF
zzz,yyy,xxx
"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx
"aaa","b""bb","ccc"
我在打开csv时也面临同样的问题,为了解决这个问题,我使用了转义字符
CSVReader csvReader = new CSVReader(new FileReader(fileName), '|','^');
例如:
CSVReader csvReader = new CSVReader(new FileReader(fileName), seprator,escaped_character);
在这里打开csv默认使用双引号作为转义字符(据我所知)
在我的例子中,我使用分隔符作为管道标志(|)
A2 | G A | Thilina | 9022V | 1 | 2 | 3 | 4 |“鲁巴辛哈”|“Abc | MATARA”|“否”| 2012 | 1668.88
在这里,“Rubasingha”打开和关闭双引号,在“否”中也打开和关闭单引号。这两个功能在默认的open csv中非常有效
但是当我们使用Abc时——只打开单引号——这也很好
但是MATARA“或”MATARA-在这里我们有一个双引号-在我的情况下,这会在使用open CSV读取CSV时产生错误
要解决此问题,请参阅本页()
有些构造函数可以提供您自己的分隔符和引号字符。如果您使用分隔符选项卡,可以执行以下操作:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t');
如果对转义字符单引号而不是双引号,则可以使用三个参数构造函数:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'');
如果您知道文件中的内容直到稍后才开始,您也可以跳过文件的前几行。因此,例如,您可以通过执行以下操作跳过前两行:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t', '\'', 2);
因此,我将默认转义字符更改为(^)符号,而不使用双引号作为转义字符
CSVReader csvReader = new CSVReader(new FileReader(fileName), '|','^');
这就是我解决问题的方法。感谢私有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)
作为Shamis答案的工作示例,它对我来说很好。如果不希望在生成的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。没有字符。
。您可以自定义其他构造函数参数的值。我遇到过这样一种情况:我的.csv文件中显示的数据两边都有三个引号。这是因为我的数据在excel中有引号。第二次创建.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
此代码将删除多余的引号,并在数据的开头和结尾只保留单引号。我希望这对某人有所帮助。如果我的格式有误或数据显示不正确,请原谅。我只是想帮助其他人。请记住,这根本不是我的代码。我只是让它正常工作对我来说,我怀疑其他人正试图获得我在这里取得的成就。
原始代码可以在这里找到我也遇到了同样的问题,并且在我实现了开放式csv库5.3版的解决方案后仍然发现了一些问题 它将我需要转换的数据转换为包含默认转义字符的csv文件。因此,为了正确执行,我需要抑制转义字符。因此,如果在Libre office或Microsoft excel中打开文件时由于出现转义字符而仍有问题,请使用此解决方案:
new CSVWriter(new FileWriter(path),
CSVWriter.DEFAULT_SEPARATOR,
CSVWriter.NO_QUOTE_CHARACTER,
CSVWriter.NO_ESCAPE_CHARACTER,
CSVWriter.DEFAULT_LINE_END
);
在版本为5.4的opencsv上,修复了相同的问题:
CSVWriter writer = new CSVWriter(new FileWriter(file), ',',
CSVWriter.NO_QUOTE_CHARACTER,
CSVWriter.DEFAULT_ESCAPE_CHARACTER,
CSVWriter.DEFAULT_LINE_END);
您知道CSV通常具有文本识别字符(在您的案例中为双引号)。这可能是CSVWriter的默认设置,您可能可以更改。问题的原因是什么?生成的CSV应该由使用这些设置的任何软件正确打开。+1用于超级SV链接。我正试图完全按照您在回答中场景1中描述的做。超级SV做得很好。我已确认它可以处理我的most常见问题字符(读写):逗号、单引号/撇号、双引号。感谢您的推荐!关于