2013-08-22 28 views
1

我使用Microsoft.VisualBasic.FileIO.TextFieldParser來讀取一個csv文件,編輯它,然後解析它。解析csv文件時如何保留引號?

問題是引號解析後沒有保留。

我試過使用parser.HasFieldsEnclosedInQuotes = true;,但由於某種原因,它似乎沒有保留引號。

當一個字段包含例如報價本期遊:

"some, field" 

之前之後

some, field 

由於兩個不同的領域

這裏是我的方法

public static void CleanStaffFile() 
    { 
     String path = @"C:\file.csv"; 
     String dpath = String.Format(@"C:\file_{0}.csv",DateTime.Now.ToString("MMddyyHHmmss")); 
     List<String> lines = new List<String>(); 

     if (File.Exists(path)) 
     { 
      using (TextFieldParser parser = new TextFieldParser(path)) 
      { 
       parser.HasFieldsEnclosedInQuotes = true; 
       parser.Delimiters = new string[] { "," }; 

       while (!parser.EndOfData) 
       { 
        string[] parts = parser.ReadFields(); 

        if (parts == null) 
        { 
         break; 
        } 

        if ((parts[12] != "") && (parts[12] != "*,116")) 
        { 
         parts[12] = parts[12].Substring(0, 3); 
        } 
        else 
        { 
         parts[12] = "0"; 
        } 

        lines.Add(string.Join(",", parts)); 
       } 
      } 

      using (StreamWriter writer = new StreamWriter(dpath, false)) 
      { 
       foreach (String line in lines) 
        writer.WriteLine(line); 
      } 

     } 

     MessageBox.Show("CSV file successfully processed :\n"); 
    } 
+0

如果現場有資格在引號它將該字段作爲一個數據項。如果數據中的引號部分需要使用不同的文本限定符。 – Romoku

+1

[這些問題](http:// stackoverflow)有[很多](http://stackoverflow.com/questions/5865747/parsing-csv-file-enclosed-with-quotes-in-c-sharp)。 com/questions/4000415/parsing-csv-file-with-commas-and-quotes-as-deliminators-pin) – Jonesopolis

+0

所以你想在引用後修改它'string.Join(「,」,parts) '?然後很容易,因爲只有包含分隔符的字段才被引號包裹。只需在'String.Join'前添加它們即可。 –

回答

1

所以你想要在string.Join(",", parts)修改它後有引號?然後很容易,因爲只有包含分隔符的字段才被引號包裹。只需在String.Join之前再次添加它們即可。

所以之前(和期望):

"some, field" 

後(不希望):

some, field 

這應該工作:

string[] fields = parser.ReadFields(); 
// insert your logic here .... 
var newFields = fields 
    .Select(f => f.Contains(",") ? string.Format("\"{0}\"", f) : f); 
lines.Add(string.Join(",", newFields)); 

編輯

我想保持報價即使不包含逗號

然後那就更簡單了:

var newFields = fields.Select(f => string.Format("\"{0}\"", f)); 
+0

我需要插入什麼邏輯?我想保留報價,即使不包含逗號感謝 – meda

+0

@meda:這只是你從我省略的部分。我必須承認,我不確定你實際想要達到的目標。但是,我認爲這與如何保留已刪除的引號的問題無關。所以'//在這裏插入你的邏輯....'是在你的代碼中以'if(parts == null)'開始的。 **根據「即使不包含引號保留報價」編輯**我的回答。 –

+0

我的意思是說即使不包含逗號 – meda

0

TextFieldParser.HasFieldsEnclosedInQuotes屬性用於如下,從MSDN頁:

如果屬性爲True,解析器假設字段包含在引號(」「),並且可以包含行結尾。

如果一個字段用引號引起來,例如,abc, "field2a,field2b", field3,並且此屬性爲True,則用引號括起來的所有文本將按原樣返回;這個例子將返回abc|field2a,field2b|field3。將此屬性設置爲False會使此示例返回abc|"field2a|field2b"|field3

引號將指示字段的開始和結束,該字段可能包含用於通常分隔字段的字符。如果您的數據本身有引號,則需要將HasFieldsEnclosedInQuotes設置爲false

如果您的數據字段可以包含分隔符和引號,則需要在解析之前先引用轉義引號,這是一個問題。基本上,你超越了簡單CSV文件的功能。