6

我正在使用 CSVHelper 库,它可以从 CSV 文件中提取对象列表,只需三行代码:

var streamReader = // Create a reader to your CSV file.
var csvReader = new CsvReader( streamReader );
List<MyCustomType> myData = csvReader.GetRecords<MyCustomType>();

但是,按文件有废话行,我需要跳过文件中的前十行。我认为使用 LINQ 来确保“干净”数据会很好,然后将该数据传递给CsvFReader,如下所示:

public TextReader GetTextReader(IEnumerable<string> lines)
{
    // Some magic here. Don't want to return null;
    return TextReader.Null;
}
public IEnumerable<T> ExtractObjectList<T>(string filePath) where T : class
{
    var csvLines = File.ReadLines(filePath)
                        .Skip(10)
                        .Where(l => !l.StartsWith(",,,"));
    var textReader = GetTextReader(csvLines);
    var csvReader = new CsvReader(textReader);
    csvReader.Configuration.ClassMapping<EventMap, Event>();
    return csvReader.GetRecords<T>();
}

但我真的坚持通过像TextReaer.

我的替代方法是通过 CsvReader 逐行处理 CSV 文件,并在提取对象之前检查每一行,但我发现这有点笨拙。

4

2 回答 2

10

StringReader 类提供了一个包装字符串的 TextReader。您可以简单地加入这些行并将它们包装在 StringReader 中:

public TextReader GetTextReader(IEnumerable<string> lines)
{
    return new StringReader(string.Join("\r\n", lines));
}
于 2013-03-31T07:05:35.083 回答
1

一种更简单的方法是使用 CsvHelper 跳过这些行。

// Skip rows.
csvReader.Configuration.IgnoreBlankLines = false;
csvReader.Configuration.IgnoreQuotes = true;
for (var i = 0; i < 10; i++)
{
    csvReader.Read();
}
csvReader.Configuration.IgnoreBlankLines = false;
csvReader.Configuration.IgnoreQuotes = false;

// Carry on as normal.
var myData = csvReader.GetRecords<MyCustomType>;

IgnoreBlankLines如果前 10 行中的任何一行为空白,则会关闭。IgnoreQuotes已关闭,因此BadDataException如果这些行包含 a ,您将不会得到任何 s "。您可以再次打开它们以恢复正常功能。

如果不知道行数,需要根据行数据进行测试,可以直接测试csvReader.Context.Record看看是否需要停止。在这种情况下,您可能需要在调用csvReader.ReadHeader()之前手动调用csvReader.GetRecords<MyCustomType>()

于 2019-01-04T03:54:29.867 回答