验证CSV文件是否没有将分隔符作为数据的一部分
本文关键字:数据 一部分 分隔符 文件 CSV 是否 验证 | 更新日期: 2023-09-27 18:22:20
我有一个CSV文件,需要检查分隔符是否不是数据的一部分。
假设它有两列,分隔符是逗号。
标题:
Column1, Column2
这样的数据:
data1, data2
data3, data3,3
第二行第二列数据无效,因为其中包含逗号。我可以读取每一行,并根据分隔符对其进行拆分,并检查数组长度。在这种情况下,如果它大于2,则数据无效。
有没有其他使用LINQ或任何外部库的方法可以在这里帮助我。
谨致问候。
类似的东西
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
,以便在返回整行之前可以枚举行。