gpt4 book ai didi

c# - 如何在 FileHelpers 中使用动态 CSV 定界符?

转载 作者:行者123 更新时间:2023-11-30 18:49:15 30 4
gpt4 key购买 nike

问题:我需要读取 CSV 文件。我使用 FileHelpers 库来实现这一点。

问题是我需要一个动态定界符(用户定义),这意味着任何东西都可以是定界符(逗号、分号、制表符、换行符,以及其他任何东西)。

问题是,FileHelpers 在属性中定义分隔符,这意味着在编译时。这使得无法动态地执行此操作。

我能做的是声明一个新类,它继承自一个基类,并在这个新类上设置分隔符。

[FileHelpers.DelimitedRecord(",")]
public class CommaCustomer : BaseCustomer
{

}

这样我只需要在基类中为每个新的定界符进行更改。问题是,我不能(也不想)为每个可能的分隔符创建一个子类。

这是我目前的代码:

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: " + cli.AddedDate.ToString("d-M-yyyy"));
Console.WriteLine("Balance: " + cli.Balance.ToString());
Console.WriteLine();
Console.WriteLine("-----------------------------");
} // Next cli

Console.ReadKey();
Console.WriteLine("Writing data to a delimited file...");
Console.WriteLine();


// To write use:
//engine.WriteFile("myyourfile.txt", custs);


//If you are using .NET 2.0 or greater is
//better if you use the Generics version:

// FileHelperEngine engine = new FileHelperEngine<Customer>();

// To read use (no casts =)
// Customer[] custs = engine.ReadFile("yourfile.txt");

// To write use:
// engine.WriteFile("yourfile.txt", custs);

} // End Sub Main


} // End Class MainClass


//------------------------
// RECORD CLASS (Example, change at your will)
// TIP: Remember to use the wizard to generate this class
public class BaseCustomer
{
public int CustId;

public string Name;
public decimal Balance;
[FileHelpers.FieldConverter(FileHelpers.ConverterKind.Date, "ddMMyyyy")]
public DateTime AddedDate;
}


[FileHelpers.DelimitedRecord(";")]
public class SemicolonCustomer : BaseCustomer
{

}


[FileHelpers.DelimitedRecord(",")]
public class CommaCustomer : BaseCustomer
{

}


}

是否有可能在运行时编译子类

[FileHelpers.DelimitedRecord(\"" + delimiter + "\")]
public class AnyDelimiterCustomer : BaseCustomer
{
}

然后在代码中引用这个运行时编译类?

最佳答案

我刚刚意识到有一个 DelimitedFileEngine 可以用另一种方式解决您的问题。

你可以走了

var engine = new DelimitedFileEngine(typeof(BaseCustomer));
engine.Options.Delimiter = ",";

似乎 BaseCustomer 需要用 [DelimitedRecord] 属性修饰,否则会引发异常,但分隔符会被提供给 的内容覆盖engine.Options.Delimiter.

以下示例使用标记为竖线分隔的格式导入逗号分隔的记录。

[DelimitedRecord("|")]
public class Format1
{
public string Field1;
public string Field2;
public string Field3;
public string Field4;
}

static void Main(string[] args)
{
var engine = new DelimitedFileEngine(typeof(Format1));
// change the delimiter
engine.Options.Delimiter = ",";

// import a comma separated record
object[] importedObjects = engine.ReadString(@"a,b,c,d");

foreach (object importedObject in importedObjects)
{
if (importedObject is Format1)
{
Format1 format1 = (Format1)importedObject;
// process it (for example, check the values)
Assert.AreEqual("a", format1.Field1);
Assert.AreEqual("b", format1.Field2);
Assert.AreEqual("c", format1.Field3);
Assert.AreEqual("d", format1.Field4);
}
}
}

关于c# - 如何在 FileHelpers 中使用动态 CSV 定界符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8725225/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com