6 个答案:
答案 0 :(得分:44)
这对我有用
CSVWriter writer =
new CSVWriter(new FileWriter(csv), ',', CSVWriter.NO_QUOTE_CHARACTER);
答案 1 :(得分:12)
您应该澄清“不受欢迎的”引号的含义。
我不希望它引用所有内容,只引用包含的字段
嵌入式逗号,引号和换行符(引用一切都是不必要的
使我的文件更大),或
我不想引用任何内容,并且我了解如果CSV包含嵌入的逗号,引号和换行符,我的CSV将无效
醇>
如果这是第一个选项,那么opencsv不支持这个 - 它要么引用一切,要么什么都不引用。如果您想要一个仅在必要时引用的开源CSV库(如果需要,可以Super CSV),请查看quote everything too。
如果这是第二个选项,那么请使用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"
答案 2 :(得分:4)
如果您不想在生成的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。您可以自定义其他构造函数参数的值。
答案 3 :(得分:1)
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);
Shamis回答的工作示例,对我来说很好。
答案 4 :(得分:0)
我遇到的一种情况是我面对的是显示在.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
此代码将删除多余的引号,并在数据的开头和结尾仅用单引号将数据保留。我希望这对某人有帮助,如果我做错了格式或未正确显示数据,请原谅。我只是想帮助别人。请记住,这根本不是我的代码。我只是让它为我工作,我怀疑其他人正在努力使我在这里取得成就。
原始代码可以在这里http://www.mcgimpsey.com/excel/textfiles.html#csvwithquotes中找到
答案 5 :(得分:0)
我也遇到了与打开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”打开并关闭双引号,在'否'中也打开并关闭单引号。这两个在默认打开csv中完美地工作
但是当我们使用'Abc时 - 只打开单引号 - 这也可以正常使用
但MATARA“或”MATARA - 在这里我们有一个双引号 - 在我的情况下,这会在使用open csv读取CSV时产生错误
有一些构造函数可以满足您自己的分隔符和引号字符的需求。假设您正在为分隔符使用选项卡,您可以执行以下操作:
CSVReader reader = new CSVReader(new FileReader("yourfile.csv"), '\t');
如果您单独引用转义字符而不是双引号,则可以使用三个arg构造函数:
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), '|','^');
这是我解决问题的方法。感谢