如果逗号(,)在引号中,那么在CSV文件中忽略逗号(,)的最佳方法是什么?
我有一个读取CSV文件的小程序,用它来构建数据表。一个要求是,如果逗号位于引号之间,则忽略逗号(名称中的逗号等)。例如如果逗号(,)在引号中,那么在CSV文件中忽略逗号(,)的最佳方法是什么?,csv,datatable,Csv,Datatable,我有一个读取CSV文件的小程序,用它来构建数据表。一个要求是,如果逗号位于引号之间,则忽略逗号(名称中的逗号等)。例如 Name, Age, Location "Henderson, David", 32, London John Smith, 19, Belfast 程序应忽略Henderson后面的逗号,并将Henderson、David作为一个字段。我当前的代码无法在末尾添加额外的列。那么,我如何才能做到这一点呢?解决方案不应
Name, Age, Location
"Henderson, David", 32, London
John Smith, 19, Belfast
程序应忽略Henderson后面的逗号,并将Henderson、David作为一个字段。我当前的代码无法在末尾添加额外的列。那么,我如何才能做到这一点呢?解决方案不应替换引号之间的逗号。谢谢
我现在的代码
Public Function BuildDataTable() As DataTable
Dim myTable As DataTable = New DataTable("MyTable")
Dim i As Integer
Dim myRow As DataRow
Dim fieldValues As String()
Dim myReader As StreamReader = New StreamReader(_fileFullPath, Encoding.GetEncoding("iso-8859-1"))
Try
fieldValues = myReader.ReadLine().Split(_seperator)
'Create data columns accordingly
If _hasheader = False Then
For i = 0 To fieldValues.Length() - 1
myTable.Columns.Add(New DataColumn("Column(" & i & ")"))
Next
Else
'if the file has header, take the first row as header for datatable
For i = 0 To fieldValues.Length() - 1
myTable.Columns.Add(New DataColumn(fieldValues(i).Replace(" ", "")))
Next
End If
myRow = myTable.NewRow
If _hasheader = False Then
For i = 0 To fieldValues.Length() - 1
myRow.Item(i) = fieldValues(i).ToString
Next
myTable.Rows.Add(myRow)
End If
While myReader.Peek() <> -1
fieldValues = myReader.ReadLine().Split(_seperator)
myRow = myTable.NewRow
For i = 0 To fieldValues.Length() - 1
myRow.Item(i) = fieldValues(i).Trim.ToString
Next
If Not csv2xml.AreAllColumnsEmpty(myRow) = True Then
myTable.Rows.Add(myRow)
End If
End While
Catch ex As Exception
End Try
End Function
公共函数BuildDataTable()作为DataTable
将myTable设置为DataTable=新DataTable(“myTable”)
作为整数的Dim i
将myRow设置为DataRow
将字段值设置为字符串()
Dim myReader As StreamReader=新的StreamReader(_fileFullPath,Encoding.GetEncoding(“iso-8859-1”))
尝试
fieldValues=myReader.ReadLine().Split(_分隔符)
'相应地创建数据列
如果_hasheader=False,则
对于i=0到fieldValues.Length()-1
添加(新数据列(“列(&i&”))
下一个
其他的
'如果文件有标头,则将第一行作为datatable的标头
对于i=0到fieldValues.Length()-1
myTable.Columns.Add(新数据列(字段值(i).Replace(“,”))
下一个
如果结束
myRow=myTable.NewRow
如果_hasheader=False,则
对于i=0到fieldValues.Length()-1
myRow.Item(i)=字段值(i).ToString
下一个
myTable.Rows.Add(myRow)
如果结束
而myReader.Peek()-1
fieldValues=myReader.ReadLine().Split(_分隔符)
myRow=myTable.NewRow
对于i=0到fieldValues.Length()-1
myRow.Item(i)=字段值(i).Trim.ToString
下一个
如果不是csv2xml.AreAllColumnsEmpty(myRow)=True,则
myTable.Rows.Add(myRow)
如果结束
结束时
特例
结束尝试
端函数
我不熟悉Visual Basic,但我认为不应该使用Split()
函数拆分行
fieldValues = myReader.ReadLine().Split(_seperator) ' DO NOT do this
相反,编写您自己的拆分函数,它逐个读取每个字符。然后有一个标志来记录您是否在双引号之间
更新 很抱歉,我对VB或C知之甚少,无法编写可运行的代码sniplet。 请阅读此伪代码(事实上它是JavaScript)…希望它有用
function split_with_quote(string, delimiter, quotation) {
if (delimiter == null) delimiter = ',';
if (quotation == null) quotation = '"';
var in_quotation = false;
var result = [];
var part = '';
for (var i = 0; i < string.length; i++) {
var ch = string[i];
if (ch == quotation) in_quotation = !in_quotation;
if (ch == delimiter && !in_quotation) {
result.push(part);
part = '';
} else {
if (ch != quotation) part += ch;
}
}
return result;
}
a = 'abc,def,"ghi,jkl",123';
split_with_quote(a); // ["abc", "def", "ghi,jkl"]
带引号的函数拆分(字符串、分隔符、引号){
如果(分隔符==null)分隔符=',';
如果(QUOTE==null)QUOTE=''”;
报价单中的var=假;
var结果=[];
var部分=“”;
对于(变量i=0;i
您希望在CSV中使用双引号字符作为文本限定符。如果字段包含在文本限定符字符中,则文本限定符允许您在字段值中使用字段分隔符字符
您可以自己对此进行编程,但这将是一个错误。有很多免费且功能强大的CSV解析器可以为您执行此操作。由于您使用的是Visual Basic,您可以查看
您仍然需要编写将CSV内容写入数据表的代码
我发现以下方法似乎有效:另一个选项是over at。不要让文章中的代码是用C#编写的这一事实困扰您;您仍然可以在项目中引用DLL(GenericParsing.DLL)并在VB中使用它 该解析器的优点在于,它包含了一种方法,您可以使用该方法从CSV返回数据表。下面是一个使用示例数据的示例:
Using parser As New GenericParsing.GenericParserAdapter(CSV_FILE_FULLNAME)
parser.ColumnDelimiter = ","
parser.TextQualifier = """"
parser.FirstRowHasHeader = True
Dim dt As DataTable = parser.GetDataTable()
End Using
谢谢你的回答,Charlee,我知道我必须改变这一行。我知道我必须编写自己的函数来完成这项工作,这是一个谜。你能再解释一下吗?即使是在C#中,如果你用的是这个。