使用 CsvHelper 时获取跳过的空行数?
Get number of skipped blank lines when using CsvHelper?
当您使用 IgnoreBlankLines
属性 或 CsvConfiguration
配置 CsvReader
并配置为跳过空行时,我该如何着手获取跳过的行数?
或者,如果我不跳过它们 - 我该如何跟踪它们?
空行似乎由具有空字符串作为值的第一个字段表示,然后每个其他字段都具有 null - 但这是一个实现细节 - 即,实际数据可能会进入这种格式,还是我错了?
如果您的文件有 header,您可以阅读 header,然后获取您所在的行号。以下示例跳过两行,因此在读取 header 时该行为 3。
void Main()
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
IgnoreBlankLines = true
};
using (var reader = new StringReader("\n\nId,Name\n1,One"))
using (var csv = new CsvReader(reader, config))
{
csv.Read();
csv.ReadHeader();
var firstRow = csv.Context.Parser.Row;
var records = csv.GetRecords<Foo>();
Console.WriteLine(firstRow); // 3
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
在没有 header 的情况下获取行号只会稍微复杂一些。
void Main()
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
IgnoreBlankLines = true,
HasHeaderRecord = false
};
using (var reader = new StringReader("\n\n1,One"))
using (var csv = new CsvReader(reader, config))
{
var isFirstRow = true;
var firstRow = 0;
var records = new List<Foo>();
while (csv.Read())
{
if (isFirstRow)
{
firstRow = csv.Context.Parser.Row;
isFirstRow = false;
}
records.Add(csv.GetRecord<Foo>());
}
Console.WriteLine(firstRow); // 3
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
当您使用 IgnoreBlankLines
属性 或 CsvConfiguration
配置 CsvReader
并配置为跳过空行时,我该如何着手获取跳过的行数?
或者,如果我不跳过它们 - 我该如何跟踪它们?
空行似乎由具有空字符串作为值的第一个字段表示,然后每个其他字段都具有 null - 但这是一个实现细节 - 即,实际数据可能会进入这种格式,还是我错了?
如果您的文件有 header,您可以阅读 header,然后获取您所在的行号。以下示例跳过两行,因此在读取 header 时该行为 3。
void Main()
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
IgnoreBlankLines = true
};
using (var reader = new StringReader("\n\nId,Name\n1,One"))
using (var csv = new CsvReader(reader, config))
{
csv.Read();
csv.ReadHeader();
var firstRow = csv.Context.Parser.Row;
var records = csv.GetRecords<Foo>();
Console.WriteLine(firstRow); // 3
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
在没有 header 的情况下获取行号只会稍微复杂一些。
void Main()
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
IgnoreBlankLines = true,
HasHeaderRecord = false
};
using (var reader = new StringReader("\n\n1,One"))
using (var csv = new CsvReader(reader, config))
{
var isFirstRow = true;
var firstRow = 0;
var records = new List<Foo>();
while (csv.Read())
{
if (isFirstRow)
{
firstRow = csv.Context.Parser.Row;
isFirstRow = false;
}
records.Add(csv.GetRecord<Foo>());
}
Console.WriteLine(firstRow); // 3
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}