CSV行拆分成字符串数组问题

时间:2010-08-21 14:10:29

标签: c# string split

你如何将此行拆分为字符串数组

问题是Rutois,a。 ,所以你不能直接拆分','分隔符..

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

感谢

6 个答案:

答案 0 :(得分:7)

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

FileHelpers是一个很好的图书馆。

答案 1 :(得分: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文件中获取记录。

答案 2 :(得分:1)

你可以使用odbc连接到文件检查这个

link(如果链接没有多大帮助,只需谷歌“将csv文件与odbc连接”)

如果你在odbc中遇到问题,我猜这个文件不是有效的csv文件。

答案 3 :(得分: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("\"", "");
}

希望这有帮助。

答案 4 :(得分:0)

我很想换出引用字符串中出现的引号,然后使用split。这会奏效。

        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, ",");

答案 5 :(得分:0)

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

这是正确的正则表达式:

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