2010-08-21 52 views
1

您将如何将拆分为字符串数组将CSV行拆分为字符串数组问题

问题是Rutois a.s. ,所以您不能直接与','分离分裂..

543472,"36743721","Rutois, a.s.","151","some name","01341",55,"112",1 

感谢

+0

给的,你从上面的字符串想要的结果的一个例子。 – 2010-08-21 15:08:37

+0

543472; 36743721; Rutois,as; 151; some name; 01341; 55; 112; 1 – 2010-08-21 15:42:12

+0

这是一个VB.NET问题,但答案类似于@ Darin's:http://stackoverflow.com/questions/959448/split-csv-string – TrueWill 2010-08-21 15:51:58

回答

6

您可以使用正则表达式从行挑选出的值:

string line ="543472,\"36743721\",\"Rutois, a.s.\",\"151\",\"some name\",\"01341\",55,\"112\",1"; 
var values = Regex.Matches(line, "(?:\"(?<m>[^\"]*)\")|(?<m>[^,]+)"); 
foreach (Match value in values) { 
    Console.WriteLine(value.Groups["m"].Value); 
} 

输出:

543472 
36743721 
Rutois, a.s. 
151 
some name 
01341 
55 
112 
1 

这当然假定你实际上已经得到了完整的CSV记录在串。请注意,CSV记录中的值可能包含换行符,因此只能通过将换行符分行来获取CSV文件中的记录。

+0

我检查过你的正则表达式,它在这种情况下失败:“text1,\”text2,\“text3”它应该返回值:text1 | “text2 |”text3,但它返回:text1 | text2,| text3 – Bronek 2013-06-20 09:24:52

+0

@Bronek:你为什么认为它应该这样做? – Guffa 2013-06-21 07:28:45

+0

...因为它不应该在第二个引号后面划分这些数据。在这种情况下,逗号被认为是分隔符。 – Bronek 2013-06-21 11:04:30

7

我会使用CSV解析器,而不是rolling your own建议您。

FileHelpers是一个不错的图书馆这个工作。

+0

它实际上是一个非常简单的有限状态机。几年前,我写了一篇文章,因为ADO觉得这个任务太过分了。 – 2010-08-21 15:24:27

+2

+1。 http://www.codeproject.com/KB/database/CsvReader.aspx是一个不错的轻量级之一。 @ liho1eye:这可能很简单,但重新发明轮子不会为您的客户创造价值。 – TrueWill 2010-08-21 15:45:47

+0

@TrueWills有点循环逻辑。此外,我只是看着你的链接,这似乎与我的解决方案几乎完全相同......可能打磨的更好,但是(看看修订日志)比我年轻至少2年。并不是说我试图要求这个实施的权利。它只是证明CSV解析器很容易制作。 – 2010-08-21 16:02:51

1

您可以连接使用ODBC检查文件,该

link(如果链接没有太多帮助它只是谷歌“连接使用ODBC CSV文件”)

如果您在ODBC问题还我猜文件不是有效的csv文件。

+0

这可能是伟大的问题是,CSV文件无效! ..感谢文件创建者.. – 2010-08-21 14:54:59

+1

@ PaN1C_Showt1Me:示例CSV有效。包含逗号的字段用双引号括起来。请参阅http://en.wikipedia.org/wiki/Comma-separated_values – TrueWill 2010-08-21 15:48:39

0

我想你想是这样的 -

string csv = 543472,"36743721","Rutois, a.s.","151","some name","01341",55,"112",1 ; 
string[] values; 
values = csv.Split(","); 
for(int i = 0; i<values.Length; i++) 
{ 
    values[i] = values[i].Replace("\"", ""); 
} 

希望这有助于。

+2

,除非你打算将所有内部逗号分割为 – 2010-08-21 15:21:04

+0

这就是问题.. – 2010-08-21 15:43:01

+0

我该如何检查它是否有效? Console.WriteLine(值);? – 2014-05-19 18:06:19

0

我会试图将出现在引用字符串内部的引号换掉,然后使用拆分。这将工作。

 string csv = "543472,\"36743721\",\"Rutois, a.s.\",\"151\",\"some name\",\"01341\",55,\"112\",1"; 


     const string COMMA_TOKEN = "[COMMA]"; 
     string[] values; 
     bool inQuotes = false; 

     StringBuilder cleanedCsv = new StringBuilder(); 
     foreach (char c in csv) 
     { 
      if (c == '\"') 
       inQuotes = !inQuotes; //work out if inside a quoted string or not 
      else 
      { 
       //Replace commas in quotes with a token 
       if (inQuotes && c == ',') 
        cleanedCsv.Append(COMMA_TOKEN); 
       else 
        cleanedCsv.Append(c); 
      } 
     } 

     values = cleanedCsv.ToString().Split(','); 

     //Put the commas back 
     for (int i = 0; i < values.Length; i++) 
      values[i] = values[i].Replace(COMMA_TOKEN, ","); 
+0

我检查了你的解决方案,在这种情况下失败:“text1,\”text2,\“text3”它应该返回值:text1 | “text2 |”text3,但它返回:text1 |文本2,文字3 – Bronek 2013-06-20 09:34:49

0

如果第一个字符是引号,则其他RegEx回答将失败。

这是正确的正则表达式:

string[] columns = Regex.Split(inputRow, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");