使用FileHelpers库读取csv文件时遇到麻烦:
我有一个csv文件,其中有些行,如果第一行也具有“字符”,第二行也具有“”字符,那么第二行将是读取后第一行的最后一列。
如果我的csv文件中有几行,所有行都有一行,而其中有一行字符,则该行将被忽略。
真的需要帮助!
这是我的课程
[DelimitedRecord(",")]
[IgnoreEmptyLines()]
[IgnoreFirst()]
public sealed class MyClass
{
[FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.AllowForBoth)]
[FieldTrim(TrimMode.Both)]
public String NAME;
[FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.AllowForBoth)]
[FieldTrim(TrimMode.Both)]
public String NOTES;
}
还有我读取的文件代码:
OpenFileDialog ofd = new OpenFileDialog
{
Filter = "CSV files (*.csv)|*.csv",
FilterIndex = 0,
CheckFileExists = true,
RestoreDirectory = true
};
if (ofd.ShowDialog(this) == DialogResult.OK)
{
if (AppSetting.IsFileLocked(ofd.FileName))
{
//file in is use
MessageUtility.ShowNotify(LanguagesMessage.GetLanguagesMessage("USING"));
return;
}
else
{
FileInfo f = new FileInfo(ofd.FileName);
if (f.Extension != ".csv")
{
MessageUtility.ShowNotify(MsgFormatFile);
return;
}
}
var _curr_encoding = SimpleHelpers.FileEncoding.DetectFileEncoding(ofd.FileName);
if (_curr_encoding == null)
{
MessageUtility.ShowNotify(MsgFormatFile);
return;
}
if (_curr_encoding.CodePage == _encoding_export_import.CodePage)
{
_curr_encoding = _encoding_export_import;
}
else
{
_curr_encoding = Encoding.GetEncoding(_curr_encoding.CodePage);
}
var engine = new FileHelperEngine<MyClass>(_curr_encoding);
engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;
engine.Encoding = _curr_encoding;
engine.AfterReadRecord += Engine_AfterReadRecord;
List<MyClass> lstDataImports = engine.ReadFile(ofd.FileName).ToList();
if (engine.ErrorManager.ErrorCount > 0)
{
MessageUtility.ShowNotify(MsgFormatFile);
engine.ErrorManager.SaveErrors("Errors.txt");
return;
}
else
{
if (lstDataImports.Count() < 1)
{
MessageUtility.ShowNotify(LanguagesMessage.GetLanguagesMessage_SM("MY_ERROR"));
return;
}
}
if (!ValidateHeader(engine.HeaderText))
{
return;
}
}
答案 0 :(得分:1)
当使用MyClass
和QuoteMode.OptionalForBoth
配置MultilineMode.AllowForBoth
时,这是预期的行为。
说明:您可以引用这些字段(通过归因QuoteMode.OptionalForBoth
),并允许记录在下一行继续(通过归因MultilineMode.AllowForBoth
)。
您还必须记住,如果不清楚的话,引号就是您要读取的记录前后的引号。