如何拆分列可能包含的csv,

q09*_*987 95 .net c# csv

特定

2,1016,7 /二千○八分之三十一14:22,杰夫达尔加斯6 /二千零十一分之五22:21,http://stackoverflow.com, "科瓦利斯,OR",7679,351,81,b437f461b3fd27387c5d8ab47a293d35,34

如何使用C#将上述信息拆分为字符串,如下所示:

2
1016
7/31/2008 14:22
Geoff Dalgas
6/5/2011 22:21
http://stackoverflow.com
Corvallis, OR
7679
351
81
b437f461b3fd27387c5d8ab47a293d35
34
Run Code Online (Sandbox Code Playgroud)

如您所见,其中一列包含,<=(Corvallis,OR)

// update //基于 C#Regex Split - 引号外的逗号

string[] result = Regex.Split(samplestring, ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
Run Code Online (Sandbox Code Playgroud)

Tim*_*Tim 166

使用该Microsoft.VisualBasic.FileIO.TextFieldParser课程.这将处理解析分隔文件,TextReader或者Stream某些字段用引号括起来而有些字段不包含在引号中.

例如:

using Microsoft.VisualBasic.FileIO;

string csv = "2,1016,7/31/2008 14:22,Geoff Dalgas,6/5/2011 22:21,http://stackoverflow.com,\"Corvallis, OR\",7679,351,81,b437f461b3fd27387c5d8ab47a293d35,34";

TextFieldParser parser = new TextFieldParser(new StringReader(csv));

// You can also read from a file
// TextFieldParser parser = new TextFieldParser("mycsvfile.csv");

parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");

string[] fields;

while (!parser.EndOfData)
{
    fields = parser.ReadFields();
    foreach (string field in fields)
    {
        Console.WriteLine(field);
    }
} 

parser.Close();
Run Code Online (Sandbox Code Playgroud)

这应该导致以下输出:

2
1016
7/31/2008 14:22
Geoff Dalgas
6/5/2011 22:21
http://stackoverflow.com
Corvallis, OR
7679
351
81
b437f461b3fd27387c5d8ab47a293d35
34

有关更多信息,请参阅Microsoft.VisualBasic.FileIO.TextFieldParser.

您需要Microsoft.VisualBasic在"添加引用.NET"选项卡中添加引用.

  • 老兄,非常感谢你为这个解决方案,我有大约500K +行的CSV数据,我需要加载到一个表中,并加载包含在引号内的逗号.如果我们的路径穿过,我欠你一份你选择的成人饮料. (7认同)
  • 我们可以解决微软没有提供一个带字符串的构造函数,所以我们必须首先跳过将它转换为流的箍?否则,很好的答案. (2认同)
  • 遗憾的是,这不适用于.NET Core (2认同)

小智 28

这太晚了,但这对某人有帮助.我们可以使用RegEx如下.

Regex CSVParser = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");
String[] Fields = CSVParser.Split(Test);
Run Code Online (Sandbox Code Playgroud)

  • 太棒了.宁愿使用它而不是导入整个其他库.布拉沃. (3认同)

sgo*_*les 5

您可以拆分所有逗号后面都有偶数引号的逗号.

您还希望以specfCSV格式查看有关处理逗号的信息.

有用的链接: C# Regex Split - commas outside quotes

  • @ q0987 - 这不是正确的答案.框架中内置了对此的支持:http://stackoverflow.com/questions/6542996/how-to-split-csv-whose-columns-may-contain/6543418#6543418 (3认同)

Rol*_*oly 5

我看到如果您在 Excel 中粘贴 csv 分隔文本并执行“文本到列”,它会要求您输入“文本限定符”。它默认为双引号,因此它将双引号内的文本视为文字。我想象 Excel 通过一次一个字符来实现这一点,如果遇到“文本限定符”,它会继续转到下一个“限定符”。您可以自己使用 for 循环和布尔值来实现它,以表示您是否在文字文本中。

public string[] CsvParser(string csvText)
{
    List<string> tokens = new List<string>();

    int last = -1;
    int current = 0;
    bool inText = false;

    while(current < csvText.Length)
    {
        switch(csvText[current])
        {
            case '"':
                inText = !inText; break;
            case ',':
                if (!inText) 
                {
                    tokens.Add(csvText.Substring(last + 1, (current - last)).Trim(' ', ',')); 
                    last = current;
                }
                break;
            default:
                break;
        }
        current++;
    }

    if (last != csvText.Length - 1) 
    {
        tokens.Add(csvText.Substring(last+1).Trim());
    }

    return tokens.ToArray();
}
Run Code Online (Sandbox Code Playgroud)