我需要用单个字符(逗号)使文本非军事化。但是我想只使用该逗号作为分隔符,如果它没有用引号封装。
一个例子:
Method,value1,value2
将包含三个值:Method,value1和value2
可是:
Method,"value1,value2"
将包含两个值:Method和“value1,value2”
我不确定如何解决这个问题,因为在拆分字符串时我会使用:
String.Split(',');
但这会基于所有逗号进行非军事化。这可能不会变得过于复杂并且必须手动检查字符串的每个字符。
提前致谢
答案 0 :(得分:2)
从我的评论中复制:使用可用的csv解析器,例如VisualBasic.FileIO.TextFieldParser
或this或this。
根据要求,以下是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