验证CSV文件是否没有将分隔符作为数据的一部分

本文关键字:数据 一部分 分隔符 文件 CSV 是否 验证 | 更新日期: 2023-09-27 18:22:20

我有一个CSV文件,需要检查分隔符是否不是数据的一部分。

假设它有两列,分隔符是逗号。

标题:

Column1, Column2

这样的数据:

data1, data2
data3, data3,3

第二行第二列数据无效,因为其中包含逗号。我可以读取每一行,并根据分隔符对其进行拆分,并检查数组长度。在这种情况下,如果它大于2,则数据无效。

有没有其他使用LINQ或任何外部库的方法可以在这里帮助我。

谨致问候。

验证CSV文件是否没有将分隔符作为数据的一部分

类似的东西

 var content = new List<string>();
        using (StreamReader reader = new StreamReader(path)) 
        {
            string line = reader.ReadLine();
            while (line != null)
            {
                content.Add(line);
                line = reader.ReadLine();          //read in all lines
            }
        }
//var content = File.ReadAllLines(path, Encoding.ASCII); //bad practice, see comments
var vaildContent = (from val in content                       //specify source ("content"), create temporary var ("val") for processing
                                where val.Split(new []{","},  StringSplitOptions.RemoveEmptyEntries).Length == 2  // condition(s)
                                select val).ToList(); //If condition is true, slect the object

会实现你想要的,即使我认为不需要林克。当然,您可以扩展它(将我的硬编码"2"替换为基于文件头构建的自定义值)。

您可以先计算标题,计算它应该是多少列。然后,对于每个数据,用逗号分隔,并在标题中取尽可能多的列。

var lines = File.ReadLines(path);
// need to check how many lines returned before reaching here
var header = lines.FirstOrDefault();
var count = (header ?? string.Empty).Count(x => x == ',') + 1;
var data = lines
    .Skip(1)
    .Select(x => x
        .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
        .Take(count)
        .ToArray());

StreamReader而不是File.ReadLines(path)更新,并将其包装在方法中。

static IEnumerable<string[]> ReadCsv(string path)
{
    using (var stream = new StreamReader(path))
    {
        var line = stream.ReadLine();
        if (line != null)
        {
            var count = line.Count(x => x == ',') + 1;
            while ((line = stream.ReadLine()) != null)
            {
                var data = line
                    .Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)
                    .Take(count)
                    .ToArray();
                yield return data;
            }
        }
    }
}

使用

IEnumerable<string[]> lines = ReadCsv(path);

更新2正如@Juharr所建议的,ReadAllLines被替换为ReadLines,以便在返回整行之前可以枚举行。