c# - 不要按转义字符串拆分 - C#

标签 c# .net

<分区>

我需要用逗号分隔一个 csv 文件,除了引号之间的列。但是,我在这里所拥有的似乎并没有实现我所需要的,并且列中的逗号被拆分为单独的数组项。

    public List<string> GetData(string dataFile, int row)
    {
        try
        {
            var lines = File.ReadAllLines(dataFile).Select(a => a.Split(';'));
            var csv = from line in lines select (from piece in line select piece.Split(',')).ToList();
            var foo = csv.ToList();
            var result = foo[row][0].ToList();
            return result;
        }
        catch
        {
            return null;
        }
    }

    private const string QUOTE = "\"";
    private const string ESCAPED_QUOTE = "\"\"";
    private static char[] CHARACTERS_THAT_MUST_BE_QUOTED = { ',', '"', '\n' };

    public static string Escape(string s)
    {
        if (s.Contains(QUOTE))
            s = s.Replace(QUOTE, ESCAPED_QUOTE);

        if (s.IndexOfAny(CHARACTERS_THAT_MUST_BE_QUOTED) > -1)
            s = QUOTE + s + QUOTE;

        return s;
    }

在这种情况下,我不确定在哪里可以使用我的转义函数。

例子:

Degree,Graduate,08-Dec-17,Level 1,"Advanced, Maths"

字符串 Advanced, Maths 被拆分成两个我不想要的不同数组项

最佳答案

您可以使用正则表达式、linq 或只是遍历每个字符并使用 bool 值来确定当前行为应该是什么。这个问题实际上让我开始思考,因为我之前只是循环浏览并对每个角色采取行动。这是 Linq 分解整个 csv 文档的方法,假设行尾可以用 ';' 找到:

private static void Main(string[] args)
    {
        string example = "\"Hello World, My name is Gumpy!\",20,male;My sister's name is Amy,29,female";

        var result1 = example.Split(';')
                             .Select(s => s.Split('"')) // This will leave anything in abbreviation marks at odd numbers
                             .Select(sl => sl.Select((ss, index) => index % 2 == 0 ? ss.Split(',') : new string[] { ss })) // if it's an even number split by a comma
                             .Select(sl => sl.SelectMany(sc => sc));

        Console.WriteLine("Press any key to continue.");
        Console.ReadKey();
    }

关于c# - 不要按转义字符串拆分 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47882512/

相关文章:

c# - CodedUI 测试的性能工具

c# - ExcelDataReader 在某些情况下不读取 xls 文件

.net - 当 .NET 崩溃报告中的 P9 "bucket"包含乱码而不是导致崩溃的异常名称时,这意味着什么?

c# - 引用类型参数问题

c# - 如何将信息传递到 Umbraco 中的所有页面

c# - Visual Studio - ExcludeFromCodeCoverage

java - C# 版本的 mp4parser

.net - 如何从 Mac 将 Web 应用程序部署到 Azure 云服务?

.net - mono把app.config放在哪里

c# - 查询事件目录以直接获取专有名称的电子邮件属性?