CSV Helper:解析空单元格与空单元格
CSV Helper: Parsing null vs empty cells
我正在使用 CSVHelper 来解析 CSV 文件。
我在识别空单元格值或具有某个值的单元格(即一个或多个 spaces)时遇到一些问题。
问题是,当用户在其单元格中的文件中仅添加一个 space 并上传文件时,CSV 助手会修剪该单元格值,以便该值作为“”传递。
现在,当用户没有向单元格中添加任何内容(或类型)时,这也会像“”一样传递。
所以我想要的是:
- 不应允许上传空值。
- 一个单元格中允许一个或多个 space。
如何使用 CSVHelper 实现此目的。下面是我的示例代码:
using (TextReader fileReader = new StreamReader(file.OpenReadStream()))
{
var configuration = new Configuration
{
HasHeaderRecord = parameter.HasHeader,
Delimiter = parameter.Delimiter.ToString(),
Quote = parameter.Quote
};
using (var csv = new CsvReader(fileReader, configuration))
{
for (int rowIndex = 0; await csv.ReadAsync(); rowIndex++)
{
var record = csv.GetRecord<dynamic>() as IDictionary<string, object>;
string[] row = record?.Select(i => i.Value as string).ToArray();
for (int i = 0; i < row.Length; i++)
{
//process rows
}
}
}
}
下面是 csv 示例:
"1"," ","1"
"2","0"," "
"3","","1"
在上面的 csv 中,第一行有第二列,其中一个 space 应该被允许
第三行的第二列为空值,这是不允许的。
我的代码中有什么遗漏或有任何解决方法来处理这个问题吗?
谢谢
CsvHelper 15.0.3
使用以下代码,我在有空格的地方显示空格,在空的地方显示空。
也许还有其他事情发生?
static void Main(string[] args)
{
ProcessRecords();
}
static async void ProcessRecords()
{
using (var reader = new StringReader("\"1\",\" \",\"1\"\n\"2\",\"0\",\" \"\n\"3\",\"\",\"1\""))
{
var configuration = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
Delimiter = ",",
Quote = '"'
};
using (var csv = new CsvReader(reader, configuration))
{
for (int rowIndex = 0; await csv.ReadAsync(); rowIndex++)
{
Console.WriteLine($"Row: {rowIndex}");
var record = csv.GetRecord<dynamic>() as IDictionary<string, object>;
string[] row = record?.Select(i => i.Value as string).ToArray();
for (int i = 0; i < row.Length; i++)
{
if (row[i] == " ")
{
Console.WriteLine("Has a space");
}
if (row[i] == "")
{
Console.WriteLine("Empty value");
}
}
}
Console.ReadKey();
}
}
}
我正在使用 CSVHelper 来解析 CSV 文件。
我在识别空单元格值或具有某个值的单元格(即一个或多个 spaces)时遇到一些问题。
问题是,当用户在其单元格中的文件中仅添加一个 space 并上传文件时,CSV 助手会修剪该单元格值,以便该值作为“”传递。
现在,当用户没有向单元格中添加任何内容(或类型)时,这也会像“”一样传递。
所以我想要的是: - 不应允许上传空值。 - 一个单元格中允许一个或多个 space。
如何使用 CSVHelper 实现此目的。下面是我的示例代码:
using (TextReader fileReader = new StreamReader(file.OpenReadStream()))
{
var configuration = new Configuration
{
HasHeaderRecord = parameter.HasHeader,
Delimiter = parameter.Delimiter.ToString(),
Quote = parameter.Quote
};
using (var csv = new CsvReader(fileReader, configuration))
{
for (int rowIndex = 0; await csv.ReadAsync(); rowIndex++)
{
var record = csv.GetRecord<dynamic>() as IDictionary<string, object>;
string[] row = record?.Select(i => i.Value as string).ToArray();
for (int i = 0; i < row.Length; i++)
{
//process rows
}
}
}
}
下面是 csv 示例:
"1"," ","1"
"2","0"," "
"3","","1"
在上面的 csv 中,第一行有第二列,其中一个 space 应该被允许 第三行的第二列为空值,这是不允许的。
我的代码中有什么遗漏或有任何解决方法来处理这个问题吗?
谢谢
CsvHelper 15.0.3
使用以下代码,我在有空格的地方显示空格,在空的地方显示空。
也许还有其他事情发生?
static void Main(string[] args)
{
ProcessRecords();
}
static async void ProcessRecords()
{
using (var reader = new StringReader("\"1\",\" \",\"1\"\n\"2\",\"0\",\" \"\n\"3\",\"\",\"1\""))
{
var configuration = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
Delimiter = ",",
Quote = '"'
};
using (var csv = new CsvReader(reader, configuration))
{
for (int rowIndex = 0; await csv.ReadAsync(); rowIndex++)
{
Console.WriteLine($"Row: {rowIndex}");
var record = csv.GetRecord<dynamic>() as IDictionary<string, object>;
string[] row = record?.Select(i => i.Value as string).ToArray();
for (int i = 0; i < row.Length; i++)
{
if (row[i] == " ")
{
Console.WriteLine("Has a space");
}
if (row[i] == "")
{
Console.WriteLine("Empty value");
}
}
}
Console.ReadKey();
}
}
}