如何检查csv文件中行的最后一列是否为“;真";在缓冲读取器中
本文关键字:读取 缓冲 是否 quot csv 检查 何检查 文件 最后 一列 | 更新日期: 2023-09-27 17:58:26
我有一个CSV文件,我正在使用缓冲流逐字节读取数据。如果最后一个column = "True"
,我想忽略读取该行。我该如何实现它?
到目前为止,我得到了:
BufferedStream stream = new BufferedStream(csvFile, 1000);
int byteIn = stream.ReadByte();
while (byteIn != -1 && (char)byteIn != ''n' && (char)byteIn != ''r')
byteIn = stream.ReadByte();
如果该行的最后一列为"True",我希望忽略读取该行
首先,如果没有绝对的需要,我不会逐个字节地处理任何文件IO。其次,从.Net中的文本文件中读取行是一种非常便宜的操作。
以下是一些天真的起始代码,它忽略了字符串CSV值的可能性:
List<string> matchingLines = new List<string>();
using (var reader = new StreamReader("data.csv"))
{
string rawline;
while (null != (rawline = reader.ReadLine()))
{
if (rawline.TrimEnd().Split(',').Last() == "True") continue;
matchingLines.Add(rawline);
}
}
实际上,建议将每个CSV行解析为强类型对象,然后使用LINQ对该集合进行筛选。然而,这可能是一个单独问题的单独答案。
我会将整个CSV文件读取/导入到DataTable对象中,然后对数据表执行Select以包括最后一列不等于true的行。
这里有一个使用StreamReader而不是BufferedStream的解决方案:
public string RemoveTrueRows( string csvFile )
{
var sr = new StreamReader( csvFile );
var line = string.Empty;
var contentsWithoutTrueRows = string.Empty;
while ( ( line = sr.ReadLine() ) != null )
{
var columns = line.Split( ',' );
if ( columns[ columns.Length - 1 ] == "True" )
{
contentsWithoutTrueRows += line;
}
}
sr.Close();
return contentsWithoutTrueRows;
}
除了jkirkwood的答案外,您还可以读取每一行,并有条件地向对象列表中添加一个类或结构。
一些快速的半伪代码:
List<MyObject> ObjectList = new List<MyObject>();
struct MyObject
{
int Property1;
string Property2;
bool Property3;
}
while (buffer = StreamReader.ReadLine())
{
string[] LineData = buffer.Split(',');
if (LineData[LineData.Length - 1] == "true") continue;
MyObject CurrentObject = new MyObject();
CurrentObject.Property1 = Convert.ToInt32(LineData[1]);
CurrentObject.Property2 = LineData[2];
CurrentObject.Property3 = Convert.ToBoolean(LineData[LineData.Length - 1]);
ObjectList.Add(CurrentObject);
}
这实际上有点取决于你读过数据后想对数据做什么
希望这个例子能有所帮助。
编辑
正如评论中所指出的,请注意这只是一个快速的例子。您的CSV文件可能有限定符和其他使字符串分割完全无用的东西。带走的概念是将行数据读取到某种临时变量中,根据所需条件对其进行评估,然后根据需要将其输出或添加到集合中。
编辑2
如果行长度不同,则需要获取最后一个字段,而不是第*n*个字段,因此我更改了布尔字段获取器,以显示如何始终获取最后一字段,而非第42个字段。