FileHelper库中是否有内置字段属性,它会在最终生成的CSV中添加标题行?
我用Google搜索并没有找到太多信息.目前我有这个:
DelimitedFileEngine _engine = new DelimitedFileEngine(T);
_engine.WriteStream
(HttpContext.Current.Response.Output, dataSource, int.MaxValue);
Run Code Online (Sandbox Code Playgroud)
它工作,但没有标题.
我正在考虑FieldTitleAttribute
使用类似的属性并将其用作列标题.
所以,我的问题是,我在哪一点检查属性并插入标题列?以前有人做过类似的事吗?
我想插入标题并使用与实际字段名称不同的自定义文本,只需在对象的每个成员上都有一个属性:
[FieldTitleAttribute("Custom Title")]
private string Name
Run Code Online (Sandbox Code Playgroud)
并且可能是一个选项,告诉引擎在生成时插入标题.
因此,当WriteStream
或者WriteString
被调用时,标题行将与自定义标题插入.
我找到了几个DelimitedFileEngine的事件,但不是检测当前记录是第一行以及如何在此之前插入行的最佳方法.
下面的代码用于使用ASP.NET MVC2中的FileHelpers读取固定宽度的上载文件内容文本文件
第一行和最后一行的长度较小,因此ReadStream会导致异常.所有其他线都有适当的固定宽度.如何跳过第一行和最后一行或其他方式来读取数据无异常?
[FixedLengthRecord()]
class Bank
{
[FieldFixedLength(4)]
public string AINETUNNUS;
[FieldFixedLength(16)]
public string TEKST1;
[FieldFixedLength(3)]
public string opliik;
[FieldFixedLength(2)]
public string hinnalis;
};
[AcceptVerbs(HttpVerbs.Post)]
[Authorize]
public ActionResult LoadStatement(HttpPostedFileBase uploadFile)
{
FileHelperEngine engine = new FileHelperEngine(typeof(Bank));
var res = engine.ReadStream(new StreamReader(uploadFile.InputStream,
Encoding.GetEncoding(1257))) as Bank[];
}
Run Code Online (Sandbox Code Playgroud) 我正在使用FileHelpers库将csv文件导入数据库表.我在导入文件时遇到问题,该文件的字段以文件头中的数字('800NUMBER')开头.
导入代码:
DataTable data = CommonEngine.CsvToDataTable(file, ',');
例外:
FileHelpers.FileHelpersException: The string '800NUMBER' not is a valid .NET identifier. at FileHelpers.RunTime.FieldBuilder..ctor(String fieldName, String fieldType) at FileHelpers.RunTime.DelimitedClassBuilder.AddField(String fieldName, String fieldType) at FileHelpers.RunTime.CsvClassBuilder.AddField(String fieldName, String fieldType) at FileHelpers.RunTime.DelimitedClassBuilder.AddField(String fieldName) at FileHelpers.RunTime.CsvClassBuilder..ctor(CsvOptions options) at FileHelpers.CsvEngine.CsvToDataTable(String filename, String classname, Char delimiter, Boolean hasHeader) at FileHelpers.CommonEngine.CsvToDataTable(String filename, Char delimiter)
我不确定是否有办法逃脱列名称,如'[800NUMBER]'.
列名称无法更改,因为这是客户端向我们提供的方式.
谢谢你,
-Oleg
通过分别从'data'行读取'header'行解决了这个问题.然后,我更改'data'中的列名并使用SqlBulkCopy导入数据库.
FileHelpers.CsvOptions options = new FileHelpers.CsvOptions("ImportRecord", ',', file);
options.HeaderLines = 0;
FileHelpers.CsvEngine engine = new FileHelpers.CsvEngine(options);
engine.Options.IgnoreFirstLines = 0;
DataTable header = engine.ReadStringAsDT(FileHelpers.CommonEngine.RawReadFirstLines(file, …
Run Code Online (Sandbox Code Playgroud) SourceForge页面 - www.filehelpers.net - 最后一次更新于2007年,没有可用的下载.
Github repo - github.com/MarcosMeli/FileHelpers - 看起来很新,但最后一个标记版本是2.1
有一个NuGet包 - www.nuget.org/packages/FileHelpers-Stable - 但它已经两年了,而且不属于主要开发者Marcos Meli.有一个竞争的NuGet包 - www.nuget.org/packages/FileHelpers - 标记为2.0.0并由Marcos Meli拥有,但该代码已有 6年历史.
有TeamCity版本可用.有一个成功的开发版本标记为2.9.16.
我应该将哪一项用于生产就绪项目?或者是其他地方的最新生产版本?
编辑
我从github master克隆了,但它没有构建 - 充满了错误.我经历了在所有子项目上将.NET版本设置为4.5并修复了一些导入并让向导运行,但仍然有几十个警告.所以Github头显然不是生产就绪的版本.
编辑2
现在版本3.1已准备就绪,GitHub存储库是最新的,并使用CI进行连续构建从www.filehelpers.net下载最新版本
我正在使用优秀的FileHelpers库来处理固定长度的航空公司计划文件.
我有一个日期字段,然后是记录中的几个字段,一个时间字段.
我想在FileHelpers记录类中结合这两个,并知道有一个自定义FieldConverter
属性.使用此属性,您可以提供自定义函数来处理字段数据并实现StringToField
和FieldToString
.
我的问题是:我是否可以将其他字段(已经阅读过)传递给该客户FieldConverter
,因此我可以将日期和时间结合在一起.FieldConverter
有一个实现,允许您引用自定义处理类和"其他字符串"甚至是一个对象数组.但是,鉴于这是在属性定义中完成的,我正在努力访问这个早期字段引用.
[FieldFixedLength(4)]
[FieldConverter(typeof(MyTimeConverter),"eg. ScheduledDepartureDate")]
public DateTime scheduledDepartureTime;
Run Code Online (Sandbox Code Playgroud) 我正在使用优秀的FileHelpers库导入许多csv文件,但遇到了问题.我有一个带有这三个示例行的csv文件
id,text,number
120,"good line this one",789
121,""not good" line", 4456
122,,5446
Run Code Online (Sandbox Code Playgroud)
和这个(例子)类
[IgnoreFirst(1)]
[IgnoreEmptyLines()]
[DelimitedRecord(",")]
public sealed class JOURNAL
{
public Int32 ID;
[FieldQuoted('"', QuoteMode.AlwaysQuoted, MultilineMode.NotAllow)]
public string TEXT;
public Int32? NUMBER;
}
Run Code Online (Sandbox Code Playgroud)
问题QuoteMode.AlwaysQuoted
是ID 122将失败并出现错误:
字段'TEXT'不是以第3行的QuotedChar开头.您可以使用FieldQuoted(QuoteMode.OptionalForRead)来允许可选的引用字段
切换到QuoteMode.OptionalForRead
将失败,ID为121错误:
字段TEXT被引用但引用的字符:"不在分隔符之前(您可以使用[FieldTrim]来避免此错误)
那么如何处理一个没有引号的空字段的csv和文本中带引号的带引号的文本字段?
我正在尝试使用FileHelpers解析这种类型的CSV文件:
Tom,1,2,3,4,5,6,7,8,9,10
Steve,1,2,3
Bob,1,2,3,4,5,6
Cthulhu,1,2,3,4,5
Greg,1,2,3,4,5,6,7,8,9,10,11,12,13,14
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何使用FileHelpers解析它.我想我应该可以这样做:
[DelimitedRecord(",")]
public class MyRecord
{
public string Name;
public List<int> Values;
}
Run Code Online (Sandbox Code Playgroud)
但FileHelpers似乎无法做到这一点.我能做的最好的就是:
[DelimitedRecord(",")]
public class MyRecord
{
public string Name;
public string Values;
public string[] ActualValuesInNiceArray
{
get { return Values.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries); }
}
}
Run Code Online (Sandbox Code Playgroud)
然后我需要Values
在逗号上拆分以获取每条记录的值集.如果我必须手动解析每个记录的一部分,那么使用FileHelpers似乎没什么意义.
我错过了什么吗?我已经浏览了文档/示例,但似乎无法找到我的格式的解决方案.Excel对我的格式没有任何问题,所以我想有一种方法可以使用现有的免费库(FileHelpers或其他一些库)来实现.有任何想法吗?
我想使用C#和FileHelpers库将大型SQL Server表导出为CSV文件.我也可以考虑C#和bcp,但我认为FileHelpers比bcp更灵活.速度不是特殊要求.
在下面的代码运行时OutOfMemoryException
抛出storage.ExtractRecords()
(一些不太重要的代码被省略):
SqlServerStorage storage = new SqlServerStorage(typeof(Order));
storage.ServerName = "SqlServer";
storage.DatabaseName = "SqlDataBase";
storage.SelectSql = "select * from Orders";
storage.FillRecordCallback = new FillRecordHandler(FillRecordOrder);
Order[] output = null;
output = storage.ExtractRecords() as Order[];
Run Code Online (Sandbox Code Playgroud)
运行以下代码时,会在以下情况下抛出"Timeout expired" link.ExtractToFile()
:
SqlServerStorage storage = new SqlServerStorage(typeof(Order));
string sqlConnectionString = "Server=SqlServer;Database=SqlDataBase;Trusted_Connection=True";
storage.ConnectionString = sqlConnectionString;
storage.SelectSql = "select * from Orders";
storage.FillRecordCallback = new FillRecordHandler(FillRecordOrder);
FileDataLink link = new FileDataLink(storage);
link.FileHelperEngine.HeaderText = headerLine;
link.ExtractToFile("file.csv");
Run Code Online (Sandbox Code Playgroud)
SQL查询运行的时间超过默认值30秒,因此超时异常.不幸的是,我在FileHelpers文档中找不到如何将SQL命令超时设置为更高的值.
我可以考虑在小数据集上循环SQL选择,直到导出整个表,但过程太复杂了.有没有一种直接的方法在大型数据库表导出时使用FileHelpers?
使用.Net 的FileHelper库,我可以以某种方式跳过源文件中的多个列吗?
根据文档和示例,我必须为所有列添加字段.唉,我有一个excel表,有216列可以导入,只需要13个.
我正在读取CSV文件,一切正常.所有字段都会转到正确的位置,但它会将®转换为 .
var engine = new FileHelperEngine(typeof(T));
return engine.ReadStream(new StreamReader(stream)) as T[];
Run Code Online (Sandbox Code Playgroud)
有关如何防止这种情况发生的任何想法?
编辑:
在花钱的帮助下,我得到了这个工作:
var engine = new FileHelperEngine(typeof(T), Encoding.UTF8);
return engine.ReadStream(new StreamReader(stream, Encoding.UTF8)) as T[];
Run Code Online (Sandbox Code Playgroud)
我必须在两个地方设置编码才能工作.否则我看到了奇怪的结果.