我从nuget下载了FileHelpers,但我不确定这个功能是否不存在,或者我没有正确的版本或什么.
我一直在环顾四周,似乎FileHelpers可能有一个属性来指定字段顺序.
我有一个看起来像这样的CSV:
a,b,c
a,b,c
a,"b,c",d
Run Code Online (Sandbox Code Playgroud)
我在带有属性的分隔类中标记第二个字段:
[FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.AllowForRead)]
public String ExchangeRate;
Run Code Online (Sandbox Code Playgroud)
但是第3行仍然将"b,c"解析为2个单独的值.
你知道我做错了什么吗?
谢谢
我试图加载使用FileHelpers文件(已经喜欢它,除了这一个问题:P)我有CSV文件数据保存到数据库中,所以我使用的是SQLDECIMAL类型来存储的CSV文件中的十进制值.
[FileHelpers.FieldOptional()]
[FileHelpers.FieldConverter(typeof(SqlDecimalConverter))]
public SqlDecimal Rate;
Run Code Online (Sandbox Code Playgroud)
所有这一切都正常,直到我有一个FixRate1的空值.这标记为错误.
"警告异常:空值发现班上场'率'SWTrade’你必须指定一个FieldNullValueAttribute因为这是一个值类型和不可阻挡的为空."
我试图把[FileHelpers.FieldNullValue(SqlDecimal.Null)],但它显然抛出一个错误.
属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式
即使我在SqlDecimalConverter类中重写FieldToString方法,在读取数据时也不会调用该函数.
那么,在这种情况下,有没有办法可以为Rate数据分配任何空值或甚至其他一些硬编码值,然后我可以用我自己的逻辑中的null direclty替换它?
如果您需要更多详细信息,请告诉我们.提前致谢.
FileHelpers支持名为"RunTime Records"的功能,当您在运行时之前不知道布局时,可以将CSV文件读入DataTable.
是否可以使用FileHelpers以相同的方式在运行时创建CSV文件?
根据某些用户输入,必须创建的CSV文件将具有只能在运行时才能知道的不同字段.我可以按照阅读部分的描述为FileHelper引擎创建所需的Type,但我无法弄清楚我的数据需要写入的格式.
var engine = new FileHelpers.FileHelperEngine(GenerateCsvType());
engine.WriteStream(context.Response.Output, dontKnow);
Run Code Online (Sandbox Code Playgroud)
编辑
或者,任何人都可以建议一个好的CSV库,可以创建一个CSV文件,直到运行时才知道它的字段?例如,从DataTable创建CSV文件.
我可以使用反射动态构建如下所示的类吗?没有方法,只有公共变量,有些有自定义属性.
是否需要.Emit方法(从我所看到的,"Emit"看起来有点挑战).
我正在使用www.FileHelpers.net上的软件,它需要一堂课.我的所有文件定义都在数据库表中,我想让所有内容更加动态(即当文件中出现新列时,代码不会更改).
[FileHelpers.DelimitedRecord(",")]
public class FileRow
{
[FileHelpers.FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string Borrower_First_Name;
[FileHelpers.FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string Borrower_Last_Name;
public string Borrower_Email;
}
Run Code Online (Sandbox Code Playgroud)
更新1:根据Vlad的回答我需要引用DLL,这是我如何做到的:
// need to reference the FileHelpers.dll from our own .exe directory
string diskFilenameFileHelpersDLL =
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location) +
@"\FileHelpers.dll";
Run Code Online (Sandbox Code Playgroud)
更新2:此外,在做了Vlad建议之后,这就是我调用FileHelper并循环结果的方法.我可能会将数据传输到列表中.
Assembly assembly = compiledResult.CompiledAssembly;
// Simple Data Test
lineContents = "John,Doe,jd123456@yahoo.com";
FileHelperEngine engine = new FileHelperEngine(assembly.GetType("FileRow"));
// FileRow[] FileRowArray = (FileRow[])engine.ReadString(lineContents);
Object[] FileRowArray = engine.ReadString(lineContents);
Object myObject = FileRowArray[0]; // only 1 row of data in …Run Code Online (Sandbox Code Playgroud) 我有一个从另一个系统导出的CSV文件,其中列顺序和定义可能会更改.我发现FileHelpers非常适合读取csv文件,但是除非在编译应用程序之前知道列的顺序,否则它似乎无法使用它.我想知道它是否可以以非类型的方式使用FileHelpers.目前我正在使用它来读取文件但是我正在手工做的其他事情,所以我有一个类:
[DelimitedRecord(",")]
public class CSVRow
{
public string Content { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这意味着每一行都在Content其中,这很好,因为我已经分割了行等,但由于文件中固有的逗号,我现在遇到此方法的问题,因此一行可能是:
"something",,,,0,,1,,"something else","","",,,"something, else"
Run Code Online (Sandbox Code Playgroud)
我对这个字符串上的逗号的简单拆分不起作用,因为在"某些东西"中有一个逗号,它会被拆分.显然,FileHelpers之类的东西非常方便,解析这些值并考虑引号.那么有可能以这种方式使用FileHelpers,没有已知的列定义,或者至少能够传递csv字符串并获取值列表,或者是否有任何好的库来执行此操作?
有没有机会让MultiRecordEngine为每条记录设置行号?我阅读了文档,发现Engine有一个LineNumber属性,但我找不到使用它的方法.
我想拥有什么:即:
[FixedLengthRecord]
public class Employee
{
public int LineNumber; // <-- setup by the engine while reading the file
[FieldFixedLength(1)]
public string Type = "2";
[FieldFixedLength(6)]
[FieldTrim(TrimMode.Left, "0")]
public int ID;
}
Run Code Online (Sandbox Code Playgroud)
或者......我可以依赖Engine.ReadFile创建的集合中的记录索引吗?即:
static void Main(string[] args)
{
var engine = new MultiRecordEngine(CustomSelector, _types);
var obj = engine.ReadFile("order.txt");
// obj.GetValue(100) returns same record found on the 101th line in the file?
}
Run Code Online (Sandbox Code Playgroud) 我正在使用FileHelpers将模型导出为CSV.它有[FieldNotInFile()]属性,在导出时排除字段,但我需要使用属性,因为我需要一些其他属性以及另一个仅使用属性的第三方库.
有没有办法让FileHelpers忽略属性?
我正在尝试通过FieldConverter属性设置我正在读取的CSV文件的日期格式,但我收到以下错误 -
属性"FieldConverter"在此声明类型上无效.它仅对"字段"声明有效.
知道为什么会发生这种情况以及如何解决这个问题吗?
[DelimitedRecord(",")]
[IgnoreFirst(1)]
public class SomeViewModel
{
public int account { get; set; }
[FieldConverter(ConverterKind.Date, "dd-MM-yyyy")]
public DateTime doc_dte { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 我有一个 csv 文件,我正在使用 FileHelpers 进行解析,并且我遇到了引号和逗号都可以出现在字段中的情况:
逗号:
323,"PC","28/02/2014","UNI001","5000",0,"Return","Returned Goods, damaged",88.00,15.40,"T1","N",0.00,"R","-",
Run Code Online (Sandbox Code Playgroud)
引用
148,"SI","13/01/2014","CGS001","4000",1,"5","17" Monitor",266.00,45.39,"T1","Y",311.39,"R","-",
Run Code Online (Sandbox Code Playgroud)
我的班级是:
[DelimitedRecord(",")]
public class Transaction
{
public int TRAN_NUMBER;
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string TypeText;
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string DATE;
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string TransactionAccount;
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string NOMINAL_CODE;
public int DEPT_NUMBER;
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string INV_REF;
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string DETAILS;
public string NET_AMOUNT;
public string TAX_AMOUNT;
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string TaxCodeName;
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string PAID_FLAG;
public string AMOUNT_PAID;
[FieldQuoted('"', QuoteMode.OptionalForBoth)]
public string VatReconText;
[FieldQuoted('"', QuoteMode.OptionalForBoth)] …Run Code Online (Sandbox Code Playgroud) filehelpers ×10
c# ×8
csv ×4
asp.net-mvc ×1
attributes ×1
c#-4.0 ×1
class ×1
comma ×1
parsing ×1
reflection ×1
types ×1