日期:2014-05-17  浏览次数:20771 次

c#高效有选择性的处理字符串分割的问题
本帖最后由 china0tech 于 2013-07-16 22:44:16 编辑
现有一csv文件,内容如下:

/*
表头 col1   col2   col3
数据 1qqq   2d,a   ers
数据 1qqq   2d     ers
直接从csv文件用readline读出来的字符串为:
string s  ="1qqq,\"2d,a\",ers";
string s1 ="1qqq,2d,ers";
csv是以逗号分割每列的数据,但是我的数据中也有逗号,所以直接以逗号分割的话对于插入datatable会有问题。
字符串s1可以正常分割得到3列数据
1qqq
2d
ers
但是字符串s以逗号分割的话,就会得到4列数据
1qqq
2d
a
ers
显然不是我想要的。
现在想得到字符串s分割后的数据为
1qqq
2d,a
ers
数据2d,a中的逗号仍然保留。

补充一下,csv文件中如果你的数据中带有逗号如:abc,def   
读取出来的数据会变成\"abc,def\"
*/


还望高手帮忙,先谢谢各位了。
C# csv String

------解决方案--------------------
string[] lines = System.IO.File.ReadAllLines("1.csv");
var query = lines.Select(x => string.Join("\t", x.Split(' ', StringSplitOptions.RemoveEmptyEntries).Select(y => "\"" + y + "\"").ToArray()));
foreach (var item in query) Console.WriteLine(query);
------解决方案--------------------
需要剔除那些在两个双引号之间的逗号。例如
private static IEnumerable<string> 分割(string s)
{
    var t1 = 某符号的所有位置(s, ',').ToList();
    var t2 = 某符号的所有位置(s, '"').ToList();
    for (var i = 0; i < t2.Count; i += 2)
        t1.Where(x => x > t2[i] && x < t2[i + 1])
            .ToList()
            .ForEach(x => t1.Remove(x));
    for (int i = 0, start = 0; i < t1.Count; start = t1[i] + 1, i++)
        yield return s.Substring(start, t1[i] - start);