C# 读取对包含逗号的字段使用引号的CSV时出现问题
我的CSV文件头设置如下:C# 读取对包含逗号的字段使用引号的CSV时出现问题,c#,csv,filehelpers,C#,Csv,Filehelpers,我的CSV文件头设置如下: COMPANY NAME,Email,Job Title,COMPANY TYPE,CITY,FIRSTNAME,LASTNAME using (TextFieldParser parser = new TextFieldParser("yourfile")) { parser.TextFieldType = FieldType.Delimited; parser.HasFieldsEn
COMPANY NAME,Email,Job Title,COMPANY TYPE,CITY,FIRSTNAME,LASTNAME
using (TextFieldParser parser = new TextFieldParser("yourfile"))
{
parser.TextFieldType = FieldType.Delimited;
parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
//Process row
string[] fields = parser.ReadFields();
foreach (string field in fields)
{
//TODO: Process field
}
}
}
我有一些代码来读取文件中的记录:
var ofd = new OpenFileDialog();
if (ofd.ShowDialog() != DialogResult.OK) return;
_importFile = ofd.FileName;
Engine = new CsvEngine("record", ',', _importFile);
Records = Engine.ReadFile(_importFile);
这段代码在我使用过的其他csv文件中运行良好,但当我在当前文件中使用它时,会出现以下错误:
FileHelpers.dll中发生类型为“FileHelpers.BadUsageException”的未处理异常
其他信息:行:180列:149。在最后一个字段“LASTNAME”之后找到分隔符“,”(文件错误或需要向记录类添加字段)
这是第180行的记录:
"Bbc Worldwide Labs, Bounce Republic Ltd",hidden@hidden.com,"Broadcaster, Voice Over & Founder Of Passion Pods",Broadcast Media,London,Emily,Chiswell
此记录与给定的字段标题匹配。那有什么问题
我能想象的唯一导致这个问题的原因是其他字段中的逗号。但它们都有引文,所以这不应该是个问题,对吧
编辑
我正在使用FileHelpers库解析CSV:根据的文档 构造函数只接受一个分隔符,即
,'
由于在其他字段中有逗号,因此它们也被视为分隔符,并且该行将被拆分为所有'、
字符
所以
将分为以下几部分:
因为姓氏后面有“,”。因此,考虑使用Microsoft.VisualBasic.FileIO程序集将伦敦作为LASTNAME,您应该能够执行以下操作:
COMPANY NAME,Email,Job Title,COMPANY TYPE,CITY,FIRSTNAME,LASTNAME
using (TextFieldParser parser = new TextFieldParser("yourfile"))
{
parser.TextFieldType = FieldType.Delimited;
parser.HasFieldsEnclosedInQuotes = true;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
//Process row
string[] fields = parser.ReadFields();
foreach (string field in fields)
{
//TODO: Process field
}
}
}
通过使用Cinchoo ETL(GitHub的一个开源库)跳过标题行,您可以加载CSV文件
COMPANY NAME, Email, Job Title,COMPANY TYPE, CITY, FIRSTNAME, LASTNAME
"Bbc Worldwide Labs, Bounce Republic Ltd",hidden @hidden.com,"Broadcaster, Voice Over & Founder Of Passion Pods", Broadcast Media, London, Emily, Chiswell
解析上述文件的过程如下所示
foreach (dynamic rec in new ChoCSVReader("EmpQuote.csv").WithFirstLineHeader())
{
Console.WriteLine(rec.COMPANY_NAME);
Console.WriteLine(rec.COMPANY_TYPE);
}
希望有帮助。您似乎在FileHelpers中发现了一个bug 请尝试以下代码:
var co = new FileHelpers.Options.CsvOptions("Output", ',', 7);
co.HeaderLines = 0;
var ce = new FileHelpers.CsvEngine(co);
var output = ce.ReadString(@"Bbc Worldwide Labs Bounce Republic Ltd,hidden@hidden.com,""Broadcaster, Voice Over & Founder Of Passion Pods"",Broadcast Media,London,Emily,Chiswell
“英国广播公司全球实验室,弹跳共和国有限公司”,hidden@hidden.com,“激情播客的播音员、配音和创始人”,广播媒体,伦敦,埃米利基斯韦尔)
这就产生了:
正如您看到的第二个字段带有“”,“
工作正常。如果第一个字段有逗号,则分析该字段时出现错误
下面是如何让它工作 定义导入类:
[FileHelpers.DelimitedRecord(",")]
public class Orders
{
[FileHelpers.FieldQuoted]
public string CompanyName;
public string Email;
[FileHelpers.FieldQuoted]
public string JobTitle;
public string CompanyType;
public string City;
public string FirstName;
public string LastName;
}
现在,该代码起作用了:
var ce = new FileHelpers.FileHelperEngine<Orders>();
var output = ce.ReadString(@"Bbc Worldwide Labs Bounce Republic Ltd,hidden@hidden.com,""Broadcaster, Voice Over & Founder Of Passion Pods"",Broadcast Media,London,Emily,Chiswell
""Bbc Worldwide Labs, Bounce Republic Ltd"",hidden@hidden.com,""Broadcaster, Voice Over & Founder Of Passion Pods"",Broadcast Media,London,Emily,Chiswell");
var ce=new FileHelpers.FileHelperEngine();
var output=ce.ReadString(@“英国广播公司环球实验室弹跳共和国有限公司,hidden@hidden.com,“播音员、画外音和激情播客创始人”,广播媒体,伦敦,艾米丽,奇斯韦尔
“英国广播公司全球实验室,弹跳共和国有限公司”,hidden@hidden.com,“激情播客的播音员、配音和创始人”,广播媒体,伦敦,艾米丽,奇斯韦尔);
它给出:
这个CSV引擎-是你自己做的还是第三方做的?最有可能的答案是,
CSV引擎
不理解引用的字段。你可能想从许多其他CSV阅读器中选择一个能够正确处理它们的。我使用的是文件帮助程序:否决什么?我的问题不够清楚吗?@Theerplexedone,你使用的是ird party library声称能够读取csv,但无法处理包含分隔符的引用文本,这是规范的一部分。我建议更改为能够处理此类内容的库。好的,但这不是我问题的解决方案。NET TextFieldParser(.NET Framework的一部分)应该能够处理这个问题。使用,“
不是一个选项。因为您使用的是第三方库,请更改您的分隔符,或者删除其他字段中的逗号。这很好,但我无法为csv定义类,因为字段名总是在更改。每次都是不同的csv文件。