问题:我需要阅读CSV文件.我使用FileHelpers库来实现这一点.
问题是我需要一个动态分隔符(用户定义),这意味着任何东西都可以是分隔符(逗号,分号,制表符,换行符,还有其他任何东西).
问题是,FileHelpers在属性中定义了分隔符,这意味着在编译时.这使得它无法动态地完成.
我能做的是声明一个新类,它继承自一个基类,并在这个新类上设置分隔符.
[FileHelpers.DelimitedRecord(",")]
public class CommaCustomer : BaseCustomer
{
}
Run Code Online (Sandbox Code Playgroud)
这样我只需要在每个新分隔符的基类中进行更改.问题是,这是我不能(也不想)为每个可能的分隔符创建子类.
这是我到目前为止的代码:
using System;
using System.Data;
using System.IO;
//using FileHelpers;
//using FileHelpers.RunTime;
namespace Examples
{
class MainClass
{
[STAThread]
static void Main()
{
FileHelpers.FileHelperEngine engine = new FileHelpers.FileHelperEngine(typeof(SemicolonCustomer));
// To read use:
string str = @"D:\Username\Desktop\FileHelpers_Examples_CSharp_VbNet\Data\SemicolonCustomers.txt";
//str = @"D:\Username\Desktop\FileHelpers_Examples_CSharp_VbNet\Data\CustomersDelimited.txt";
SemicolonCustomer[] custs = (SemicolonCustomer[])engine.ReadFile(str);
//Customer[] custs = (Customer[]) engine.ReadFile("yourfile.txt");
foreach (SemicolonCustomer cli in custs)
{
Console.WriteLine();
Console.WriteLine("Customer: " + cli.CustId.ToString() + " - " + cli.Name);
Console.WriteLine("Added Date: " …Run Code Online (Sandbox Code Playgroud) 我正在制作一个使用csv文件的网站,这个文件可以有两种格式(将来可能更多).
结构1
Header 1 Header 2 Header 3 Header 4
a b c d
x x x x
Run Code Online (Sandbox Code Playgroud)
结构2
Header 1 Header 4
a d
x x
Run Code Online (Sandbox Code Playgroud)
以上是如何在excel中显示(如果看原始它将以逗号分隔)
我想拥有2个结构的原因是因为我正在尝试利用用户可以从中导出数据的第三方网站.此站点将其导出为csv文件,第一行是标题.我真的只关心其中的两个标题并且当前不需要重置(但是你必须导出所有列都不能选择).
第二种结构是,如果用户不希望使用此站点,因为他们不想,不舒服这样做等等.他们可以选择打开excel并手动写入数据,然后将其保存为csv文件.
因此,对于手动人员,我想让它尽可能简单,好像我没有使用Header 2和Header 4数据为什么我要打扰他们进入呢?然而,与此同时,如果人们通过第一种方式并导出数据,我不希望他们必须将文件加载到excel并删除2列.
我要求标题必须始终保持完整并且是第一行.我想出的唯一想法是读取第一行并查看标题的顺序.如果它按照确切的顺序有4个标题,则以单向渲染.如果该顺序中只有2个标题以另一种方式呈现它.
我知道FileHelpers有能力做多个分隔符并选择如何渲染它但是因为我正在查看标题我不确定这是否已经融入或者我是否需要以某种方式自己编写然后告诉它该做什么.
有没有人知道我是否可以用filehelpers做到这一点?
编辑 这是我到目前为止
MultiRecordEngine engine = new MultiRecordEngine(typeof(Format2), typeof(Format1));
engine.RecordSelector = new RecordTypeSelector(CustomSelector);
using (TextReader textReader = new StreamReader(stream))
{
if (engine.RecordType == typeof(Format2))
{
var myArry = engine.ReadStream(textReader) as Format2[];
}
else if(engine.RecordType == typeof(Format1))
{
var myArry …Run Code Online (Sandbox Code Playgroud) 我在一个项目和类中使用FileHelpersMultiRecordEngine
public sealed class MultiRecordEngine
: EventEngineBase<object>, IEnumerable, IDisposable
Run Code Online (Sandbox Code Playgroud)
这个类实现了IDisposable,但是没有公共的Dispose方法......
MultiRecordEngine eng = null;
eng.Dispose(); // <---- Results in compilation error
Run Code Online (Sandbox Code Playgroud)
在GitHub上检查这个类代码我可以看到这里明确实现的方法,第913行:
void IDisposable.Dispose()
{
Close();
GC.SuppressFinalize(this);
}
Run Code Online (Sandbox Code Playgroud)
那么...... 为什么我不能调用这个方法呢?这是有意的,如果是这样,这是一个好的做法,在什么情况下?
这是我想要阅读的数据:
"Adam C. Emality","1Z620Y1V034826","14.40"
"Ethel Baeron","1Z620Y1V034604","15.19"
"Donna Lidt","1Z620Y1V034650","12.37"
Run Code Online (Sandbox Code Playgroud)
然后在读完数据之后,我想在两个集合上执行一个Join,一个是数组,一个是列表 - 我的代码如下.但是在执行读取文件行之后,我的字符串就像这样存储"\"Adam C. Emality\"" "\"1Z620Y1V034826\"" "\"14.40\""......等等.为什么会发生这种情况?我不想包括",我不知道它为什么要加入\.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FileHelpers;
using Parser;
namespace Amazon_File
{
class SpreadSheet
{
public void create(IEnumerable<SpreadList> list)
{
var steamengine = new FileHelperEngine<Records>();
var records = steamengine.ReadFile(@"C:\Users\Danny\Documents\Visual Studio 2013\Projects\Amazon File\Amazon File\Daniel.csv");
var spreadlist = from x in list
join y in records on x.Name equals y.Name
select new { y.Name, y.Track, y.worldPrice, …Run Code Online (Sandbox Code Playgroud) 我试图使用FileHelpers将csv文件中的行加载到f#中的Elasticsearch数据库以读取csv.一切都适用于小型测试文件,下面的代码片段一次读取所有记录
let readRows<'T>(filePath:string) =
let engine = FileHelperEngine(typeof<'T>)
engine.ReadFile(filePath)
|> Array.map (fun row -> row :?> 'T)
Run Code Online (Sandbox Code Playgroud)
不幸的是,它需要能够读取更大的文件,其中许多列将在以后逐行丢弃.FileHelperAsyncEngine.BeginReadFile函数返回一个IDisposable.
let readRowsAsync<'T>(filePath:string) =
let engine = new FileHelperAsyncEngine(typeof<'T>)
engine.BeginReadFile(filePath:string)
|> ...
Run Code Online (Sandbox Code Playgroud)
如何进一步将此对象处理为<T> s数组?
IgnoreFirst(int)或IgnoreLast(int)仅忽略固定数量的行作为页眉或页脚.但我喜欢忽略或评论txt/csv文件中的特定行.例如,如下所示(忽略某些段落或txt/csv中的特定行):
############# This is a comment ##########
/* Some comment paragraph
some more comments
last line of comment */
1,Foo,FooItem1
2,Foo,FooItem2
3,Goo,GooItem3
#4,Doo,DooItem4 <-- ignore.
5,Eoo,EooItem5
Run Code Online (Sandbox Code Playgroud)
我已经阅读了有关可能解决此问题的BeforeReadRecord和SkipThisRecord,但文档就像图像一样简单,没有解释也没有提供示例.
我有一个.csv文件(我无法控制数据),由于某种原因,它有引号中的所有内容.
"Date","Description","Original Description","Amount","Type","Category","Name","Labels","Notes"
"2/02/2012","ac","ac","515.00","a","b","","javascript://"
"2/02/2012","test","test","40.00","a","d","c",""," "
Run Code Online (Sandbox Code Playgroud)
我正在使用filehelpers,我想知道删除所有这些引用的最佳方法是什么?有什么东西说"如果我看到引号删除.如果没有找到引号什么都没做"?
这与数据混淆,因为我将有"\"515.00\""不必要的额外引号(特别是因为我想在这种情况下它是一个十进制而不是一个字符串".
我也不确定"javascript"是什么以及为什么它被生成但是这是来自我无法控制的服务.
编辑 这是我使用csv文件的方式.
using (TextReader textReader = new StreamReader(stream))
{
engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;
object[] transactions = engine.ReadStream(textReader);
}
Run Code Online (Sandbox Code Playgroud) 我正在使用文件助手,我不确定如何获取我的数据并将其导出到Excel文件.
我看到了一个提取记录但没有创建excel文件的教程.
我试着这样做
ExcelStorage provider = new ExcelStorage(typeof(Img));
provider.StartRow = 2;
provider.StartColumn = 1;
provider.FileName = "Customers.xls";
provider.HeaderRows = 6;
provider.InsertRecords(imgs.ToArray()); // imgs was a list before
Run Code Online (Sandbox Code Playgroud)
用户代码未处理System.IO.FileNotFoundException
消息=无法加载文件或程序集"Interop.Excel,Version = 1.3.0.0,Culture = neutral,PublicKeyToken = 3e0c08d59cc3d657"或其依赖项之一.该系统找不到指定的文件.
Source = FileHelpers.ExcelStorage FileName = Interop.Excel,Version = 1.3.0.0,Culture = neutral,PublicKeyToken = 3e0c08d59cc3d657
FusionLog ====预绑定状态信息=== LOG:User = LOG:DisplayName = Interop.Excel,Version = 1.3.0.0,Culture = neutral,PublicKeyToken = 3e0c08d59cc3d657(完全指定)LOG:Appbase = LOG:Initial PrivatePath =调用程序集:FileHelpers.ExcelStorage,Version = 2.9.9.0,Culture = neutral,PublicKeyToken = 3e0c08d59cc3d657.===日志:此绑定在默认加载上下文中启动.日志:使用应用程序配置文件:web.config日志:使用主机配置文件:日志:使用machine.config中的机器配置文件.日志:后策略引用:Interop.Excel,Version = 1.3.0.0,Culture = neutral,PublicKeyToken = 3e0c08d59cc3d657日志:尝试下载新的URL文件:LOG:尝试下载新的URL文件:Interop.Excel.DLL.日志:尝试下载新的URL文件:Interop.Excel.DLL.日志:尝试下载新的URL文件:Interop.Excel.DLL.日志:尝试下载新的URL文件:Interop.Excel.EXE.日志:尝试下载新的URL文件:Interop.Excel.EXE.日志:尝试下载新的URL文件:Interop.Excel.EXE.日志:尝试下载新的URL文件:Interop.Excel.EXE. …
我找到了一个非常好的库来读取CSV文件 - FileHelpers,但我有一个奇怪的问题.我将不胜感激.提前致谢 !
映射后,我总是从右边的最后一列中删除一个字母.
我正在使用FileHelpers.dll版本2.0.0 - 来自的DotNet 2.0 FileHelpers_2_0_0_bin_docs_wizard.zip
例如,我有一个像这样的CSV(引用了一些列,但有些列不是,它可能会改变)
name;surname
"John";Smith
"Jack";Baker
Run Code Online (Sandbox Code Playgroud)
阅读文件后:
FileHelperEngine<SemicolonsRow> engine = new FileHelperEngine<SemicolonsRow>();
engine.ErrorManager.ErrorMode = ErrorMode.SaveAndContinue;
res = engine.ReadFile("C:\\a.txt");
if (engine.ErrorManager.ErrorCount > 0)
engine.ErrorManager.SaveErrors("C:\\Log.txt");
Run Code Online (Sandbox Code Playgroud)
我明白了:
res[0].Col0 with name
res[0].Col1 with surnam (lack of e at the end)
res[1].Col0 with John
res[1].Col0 with Smit (lack of h at the end)
Run Code Online (Sandbox Code Playgroud)
当我读这样的文件时:
name;surname;country
"John";Smith;USA
"Jack";Baker;Canada
Run Code Online (Sandbox Code Playgroud)
问题出在第三栏 - 所以我得到: countr US Canad
我的FileHelpers类:
[IgnoreEmptyLines()]
[DelimitedRecord(";")]
public sealed class SemicolonsRow
{
[FieldOptional()]
[FieldQuoted('"', QuoteMode.OptionalForRead, MultilineMode.AllowForRead)]
public …Run Code Online (Sandbox Code Playgroud) 我想在FileHelpers中添加一个基于NPOI库的Excel解析引擎,但我找不到2.9.x版本的源代码.
任何人都可以指出我可以对项目进行谴责的地方吗?
我正在使用FileHelpers读取一个包含数百列的CSV文件,但我只需要前二十个左右,所以在类中创建映射时我只放了那二十列.
什么时候解析,我得到以下异常
在最后一个字段'CompanyDivision'之后找到分隔符''(文件错误或者你需要在记录类中添加一个字段)
我在其他的答案读了一个破解的,这是把空字段你不想读列的其余部分,但正如我所说的,我有数百那些.
有没有办法配置引擎在一定数量的列后停止?或者有没有办法扩展或修改引擎来做到这一点?
我从我发现的一些资源中编写了这个脚本.它工作但我有些文件我有问题.我是F#的新手,所以如何使用FileHelpersException更改行以获得确切的行问题?谢谢
// Learn more about F# at http://fsharp.net
// See the 'F# Tutorial' project for more help.
open FileHelpers
open System
[<DelimitedRecord(",")>]
type CsvRecord =
class
val field1 : string
val field2 : string
val field3 : int
new () = {
field1 = ""
field2 = ""
field3 = 0
}
end
[<EntryPoint>]
let main argv =
use file = System.IO.File.CreateText("result.txt")
let engine = new FileHelperEngine<CsvRecord>()
engine.Encoding <- new Text.UTF8Encoding()
let res =
try
engine.ReadFile("test.csv")
with
| :? FileHelpersException …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用奇妙的FileHelpers库解析来自地狱的CSV文件.
它无法处理表格的一行:
"TOYS R"" US"," INC.""",fld2,fld3,"<numberThousands>","<numberThousands>","<numberThousands>",fld7,
Run Code Online (Sandbox Code Playgroud)
FileHelper非常擅长处理"千种"格式的数字字段(使用自定义格式化程序),即使用引号,尾随逗号等包装,但它会导致第一个字段出现问题.
"TOYS R"" US"," INC.""",fld2,...
Run Code Online (Sandbox Code Playgroud)
该字段包括嵌套引号和嵌套逗号.FileHelper不知道如何处理它并将其拆分为两个单独的字段,这些字段随后会引发异常.
有没有推荐的方法来处理这个?
filehelpers ×13
c# ×11
csv ×7
.net ×4
f# ×2
parsing ×2
asynchronous ×1
idisposable ×1
import ×1
linq ×1
readfile ×1