我的CSV文件标题设置如下:
COMPANY NAME,Email,Job Title,COMPANY TYPE,CITY,FIRSTNAME,LASTNAME
我已经获得了一些代码来读取文件中的记录:
var ofd = new OpenFileDialog();
if (ofd.ShowDialog() != DialogResult.OK) return;
_importFile = ofd.FileName;
Engine = new CsvEngine("record", ',', _importFile);
Records = Engine.ReadFile(_importFile);
此代码对我使用的其他csv文件一直很好,但是当我将其与当前文件一起使用时,我收到此错误:
未处理的类型' FileHelpers.BadUsageException'发生在FileHelpers.dll
中附加信息:行: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:http://www.filehelpers.net/
答案 0 :(得分:0)
根据CsvEngine的文档,
构造函数只接受一个','
的分隔符。
由于您在其他字段中有逗号,因此它们也被视为分隔符,并且将为所有','
个字符拆分该行。
所以,
"Bbc Worldwide Labs, Bounce Republic Ltd",hidden@hidden.com,"Broadcaster, Voice Over & Founder Of Passion Pods",Broadcast Media,London,Emily,Chiswell
将分为以下几部分:
根据您的标题,这与您的7个字段不匹配。所以,你得到了
Delimiter','在最后一个字段' LASTNAME'之后找到
因为有','在LASTNAME之后。所以它将伦敦视为LASTNAME
答案 1 :(得分:0)
使用Microsoft.VisualBasic.FileIO程序集,您应该可以执行以下操作:
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
}
}
}
通过跳过标题行来处理标题行
答案 2 :(得分:0)
使用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);
}
希望它有所帮助。
答案 3 :(得分:0)
您似乎在FileHelpers中发现了一个错误。
试试这段代码:
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
"" Bbc Worldwide Labs,Bounce Republic Ltd"",hidden @ hidden.com,"" Broadcaster,Voice Over& Passion Pods的创始人"",广播媒体,伦敦,EmilyChiswell")
这给出了:
正如您所看到的,','
的第二个字段可以正常工作。看来错误在于解析第一个字段,如果它有一个逗号。
以下是如何让它发挥作用。
定义导入类:
[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");
它给出了: