除非在引号C#中,否则按字符分隔字符串

时间:2015-06-29 14:57:42

标签: c# delimited-text

我需要用单个字符(逗号)使文本非军事化。但是我想只使用该逗号作为分隔符,如果它没有用引号封装。

一个例子:

Method,value1,value2

将包含三个值:Method,value1和value2

可是:

Method,"value1,value2"

将包含两个值:Method和“value1,value2”

我不确定如何解决这个问题,因为在拆分字符串时我会使用:

String.Split(',');

但这会基于所有逗号进行非军事化。这可能不会变得过于复杂并且必须手动检查字符串的每个字符。

提前致谢

2 个答案:

答案 0 :(得分:2)

从我的评论中复制:使用可用的csv解析器,例如VisualBasic.FileIO.TextFieldParserthisthis

根据要求,以下是TextFieldParser

的示例
var allLineFields = new List<string[]>();
string sampleText = "Method,\"value1,value2\"";
var reader = new System.IO.StringReader(sampleText);
using (var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(reader))
{
    parser.Delimiters = new string[] { "," };
    parser.HasFieldsEnclosedInQuotes = true; // <--- !!!
    string[] fields;
    while ((fields = parser.ReadFields()) != null)
    {
        allLineFields.Add(fields);
    }
}

此列表现在包含一个带有两个字符串的string[]。我使用了StringReader,因为此示例使用字符串,如果源是文件,请使用StreamReader(例如,通过File.OpenText)。

答案 1 :(得分:1)

您可以尝试Regex.Split()使用模式

分割数据
",|(\"[^\"]*\")" 

这将用逗号和引号中的字符分隔。

代码示例:

using System;
using System.Linq;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string data = "Method,\"value1,value2\",Method2";
        string[] pieces = Regex.Split(data, ",|(\"[^\"]*\")").Where(exp => !String.IsNullOrEmpty(exp)).ToArray();

        foreach (string piece in pieces)
        {
            Console.WriteLine(piece);
        }
    }
}

结果:

Method
"value1,value2"
Method2

Demo