2012-09-13 242 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; 
    }