您将如何将拆分为字符串数组?将CSV行拆分为字符串数组问题
问题是Rutois a.s. ,所以您不能直接与','
分离分裂..
543472,"36743721","Rutois, a.s.","151","some name","01341",55,"112",1
感谢
您将如何将拆分为字符串数组?将CSV行拆分为字符串数组问题
问题是Rutois a.s. ,所以您不能直接与','
分离分裂..
543472,"36743721","Rutois, a.s.","151","some name","01341",55,"112",1
感谢
您可以使用正则表达式从行挑选出的值:
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文件中的记录。
我会使用CSV解析器,而不是rolling your own建议您。
FileHelpers是一个不错的图书馆这个工作。
它实际上是一个非常简单的有限状态机。几年前,我写了一篇文章,因为ADO觉得这个任务太过分了。 – 2010-08-21 15:24:27
+1。 http://www.codeproject.com/KB/database/CsvReader.aspx是一个不错的轻量级之一。 @ liho1eye:这可能很简单,但重新发明轮子不会为您的客户创造价值。 – TrueWill 2010-08-21 15:45:47
@TrueWills有点循环逻辑。此外,我只是看着你的链接,这似乎与我的解决方案几乎完全相同......可能打磨的更好,但是(看看修订日志)比我年轻至少2年。并不是说我试图要求这个实施的权利。它只是证明CSV解析器很容易制作。 – 2010-08-21 16:02:51
我想你想是这样的 -
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("\"", "");
}
希望这有助于。
,除非你打算将所有内部逗号分割为 – 2010-08-21 15:21:04
这就是问题.. – 2010-08-21 15:43:01
我该如何检查它是否有效? Console.WriteLine(值);? – 2014-05-19 18:06:19
我会试图将出现在引用字符串内部的引号换掉,然后使用拆分。这将工作。
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, ",");
我检查了你的解决方案,在这种情况下失败:“text1,\”text2,\“text3”它应该返回值:text1 | “text2 |”text3,但它返回:text1 |文本2,文字3 – Bronek 2013-06-20 09:34:49
如果第一个字符是引号,则其他RegEx回答将失败。
这是正确的正则表达式:
string[] columns = Regex.Split(inputRow, ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");
给的,你从上面的字符串想要的结果的一个例子。 – 2010-08-21 15:08:37
543472; 36743721; Rutois,as; 151; some name; 01341; 55; 112; 1 – 2010-08-21 15:42:12
这是一个VB.NET问题,但答案类似于@ Darin's:http://stackoverflow.com/questions/959448/split-csv-string – TrueWill 2010-08-21 15:51:58