2012-09-13 193 views
1

我使用下面的代码 分割逗号分隔的CSV文件。它工作正常,但 中的某些记录在数据中包含逗号,尽管逗号被保留为 作为分隔符。例如,一条记录包含一个描述文本,其中用户 已输入逗号,而我的脚本enterprets与记录结束一样。 我怎样才能克服?用内联逗号分隔逗号分隔的csv文件

下面是我的CSV文件中的一行示例。请注意行尾末尾的空记录可以包含“”字符:“

”1“,”34353434“,”Adam“,”Traxx“,”343“,”这个人是老板请对于处理 “ ”“ ,, ”“, ”“ ,, ”“”, “0” ,,”

这是我读和拆分:

Sub ReadOnlineExample() 
Dim line_read As String 
Dim tempfilename As String 
Dim i As Integer 
Dim rows_skipped As Integer 
Dim line_split(0 To 125) As String 
Dim MortalityRates(0 To 125) As Double 

tempfilename = "C:\MortalityRateTable.csv" 
Dim sr As New System.IO.StreamReader(tempfilename) 

'Split the line into individual data 
line_split = line_read.Split(",") 

'Save the split data into an array 
For i = 0 To UBound(line_split) 
    MortalityRates(i) = line_split(i) 
Next i 

End Sub 

任何人都可以帮帮我?也许这只是一个简单的解决方案,我只是看不到:-)

回答

6

使用适当的CSV解析器 - File Helpers是一个受欢迎的选项。

还有一个来自Microsoft的解析器 - Microsoft.VisualBasic.FileIO命名空间中的TextFieldParser

这些照顾CSV的细微方面,大多数手动解决方案在碰到问题之前都不会考虑这些方面。

+0

你不能同意你更多! – ggonsalv

+0

废话只是要发布! –

+0

+1 - 这是一个真正不需要重新发明的轮子。 – hatchet

0

您的示例可能不正确。
句子后半句说:"",,"","",,","","0",,"

有两个基本conditon:

  1. 分隔符标记调用enclosint整个内部字符串引号(如果你有x,y,并且分隔符是逗号,在CSV你"x,y"
  2. 引号转义为双引号(如果你在CSV有They say "Hey!""They say ""Hey!"""

其他字符串将在您输入时保存。

而且你不能用你的规则转移你的最后部分。 尝试将逗号更改为分号并导入Excel。 Excel会显示您的示例如下:

enter image description here

在我的国家是标准的CSV分隔符分号。
我编写了解析CSV的代码。你可以尝试修改它为你的目的(分隔符是可变的):

public List<string> ParseCsvRow(char delimiter, string input) 
    { 
     List<string> result = new List<string>(); 
     string step = ""; 
     bool escaped = false; 
     StringBuilder stringBuilder = new StringBuilder(); 
     int position = -1; 

     do 
     { 
      if (++position >= input.Length) 
      { 
       result.Add(stringBuilder.ToString()); 
       stringBuilder = null; 
       break; 
      } 
      step = input.Substring(position, 1); 
      switch (step) 
      { 
       case "\"": 
        if (stringBuilder.Length == 0 && !escaped) 
        { 
         escaped = true; 
         continue; 
        } 
        if (position + 1 < input.Length) 
         step = input.Substring(++position, 1); 
        else 
         step = ""; 
        if (step == "\"") 
        { 
         stringBuilder.Append("\""); 
         continue; 
        } 
        if (step.Equals(delimiter.ToString()) && escaped) 
        { 
         result.Add(stringBuilder.ToString()); 
         stringBuilder.Clear(); 
         escaped = false; 
         continue; 
        } 
        break; 
       default: 
        if (step.Equals(delimiter.ToString()) && !escaped) 
        { 
         result.Add(stringBuilder.ToString()); 
         stringBuilder.Clear(); 
         continue; 
        } 
        stringBuilder.Append(step); 
        continue; 
      } 
     } while (true); 
     return result; 
    }