如何检查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",我希望忽略读取该行

如何检查csv文件中行的最后一列是否为“;真";在缓冲读取器中

首先,如果没有绝对的需要,我不会逐个字节地处理任何文件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个字段。