C# 从写入文本字段文件帮助程序中删除可选字段

C# 从写入文本字段文件帮助程序中删除可选字段,c#,optional,filehelpers,C#,Optional,Filehelpers,如何从使用Filehelpers库输出的文本字段中删除可选字段。我用的是c# 比如说,, 我有一个共享类文件 具有诸如recordnumber、filler、payment和EndingSpace等属性 然后我只需要将recordnumber和payment写入文本文件,而不使用填充符 [FixedLengthRecord(FixedMode.ExactLength)] public partial class Person { [FieldFixedLength(10)] public str

如何从使用Filehelpers库输出的文本字段中删除可选字段。我用的是c#

比如说,, 我有一个共享类文件 具有诸如recordnumber、filler、payment和EndingSpace等属性

然后我只需要将recordnumber和payment写入文本文件,而不使用填充符

[FixedLengthRecord(FixedMode.ExactLength)]
public partial class Person
{
[FieldFixedLength(10)]
public string FirstName;
[FieldFixedLength(10)]
public string LastName;

[FieldOptional]
[FieldFixedLength(5)]
public string Optional1;

[FieldOptional]
[FieldFixedLength(5)]
public string Optional2;

[FieldOptional]
[FieldFixedLength(5)]
public string Optional3;
}

class Program
{
private static void Main(string[] args)
 {
  var engine = new FileHelperEngine<Person>();
  Person[] allPersonRecords = GetPersonExportFromDataBase() as Person[];//This will only get the FirstName,LastName,Optional2. No result for Optional1 and Optional3

  FileHelperEngine enginePerson = new FileHelperEngine(typeof(Person));

  enginePerson.AppendToFile(FileName, allPersonRecords ); //Write the records to the file

//Current Output looks like this:John      Lee            title     
//The output which I want is:John      Lee       title

 }
}
类程序
{
私有静态void Main(字符串[]args)
{
var engine=new FileHelperEngine();
Person[]allPersonRecords=GetPersonExportFromDataBase()作为Person[];//这将只获取名字、姓氏、Optional2。Optional1和Optional3没有结果
FileHelperEngine Engineeperson=新的FileHelperEngine(类型为(个人));
enginePerson.AppendToFile(文件名,allPersonRecords);//将记录写入文件
//当前输出如下所示:John Lee title
//我想要的输出是:John Lee title
}
}

您可以使用
INotifyWrite
属性在写入和修改行之前拦截行。下面是一个工作示例

[DelimitedRecord(",")]
public partial class Person : INotifyWrite<Person>
{
    public string FirstName;
    public string LastName;
    [FieldOptional]
    public string Optional1;
    [FieldOptional]
    public string Optional2;
    [FieldOptional]
    public string Optional3;

    public void BeforeWrite(BeforeWriteEventArgs<Person> e)
    {
    }

    public void AfterWrite(AfterWriteEventArgs<Person> e)
    {
        // count the non-optional fields
        var numberOfNonOptionalFields = typeof(Person).GetFields()
            .Where(f => !f.GetCustomAttributes(false).Any(a => a is FieldOptionalAttribute))
            .Count();

        // take only the first n tokens
        e.RecordLine = String.Join(",", e.RecordLine.Split(',').Take(numberOfNonOptionalFields));
    }
}      

class Program
{
    private static void Main(string[] args)
    {
        var engine = new FileHelperEngine<Person>();
        var export = engine.WriteString(
                     new Person[] { 
                       new Person() { 
                           FirstName = "Joe", 
                           LastName = "Bloggs", 
                           Optional1 = "Option 1", 
                           Optional2 = "Option 2", 
                           Optional3 = "Option 3" 
                       } 
                     });
        Assert.AreEqual("Joe,Bloggs" + Environment.NewLine, export);
        Console.WriteLine("Export was as expected");
        Console.ReadLine();
    }
}
[分隔符记录(“,”)]
公共部分类人员:INotifyWrite
{
公共字符串名;
公共字符串LastName;
[字段可选]
公共字符串选项1;
[字段可选]
公共字符串选项2;
[字段可选]
公共字符串选项3;
写入前公共无效(写入前无效)
{
}
后写公共无效(后写无效)
{
//对非可选字段进行计数
var numberOfNonOptionalFields=typeof(Person).GetFields()
.Where(f=>!f.GetCustomAttributes(false).Any(a=>a是FieldOptionalAttribute))
.Count();
//只取前n个令牌
e、 RecordLine=String.Join(“,”,e.RecordLine.Split(“,”).Take(numberOfNonOptionalFields));
}
}      
班级计划
{
私有静态void Main(字符串[]args)
{
var engine=new FileHelperEngine();
var export=engine.WriteString(
新人【】{
新人(){
FirstName=“乔”,
LastName=“Bloggs”,
Optional1=“Option 1”,
Optional2=“Option 2”,
Optional3=“选项3”
} 
});
Assert.AreEqual(“Joe,Bloggs”+Environment.NewLine,export);
Console.WriteLine(“按预期导出”);
Console.ReadLine();
}
}

如果您只想静态地忽略可选字段(即,它们从未被使用,也不想输出),您可以创建另一个表示所需输出格式的类,然后使用LINQ将列表从一种对象类型转换为另一种对象类型:

class Program
{
    static void Main(string[] args)
    {
        // dummy test data
        var originalAllPersonRecords = new Person[]
        {
            new Person { FirstName = "John", LastName = "Lee", Optional2 = "title" },
        };//This will only get the FirstName,LastName,Optional2. No result for Optional1 and Optional3

        var allPersonRecords = from p in originalAllPersonRecords select new OutputPerson{ FirstName = p.FirstName, LastName = p.LastName, Optional2 = p.Optional2 };

        FileHelperEngine enginePerson = new FileHelperEngine(typeof(OutputPerson));

        string fileName = "Wherever you want the file to go";
        enginePerson.AppendToFile(fileName, allPersonRecords); //Write the records to the file

        //Current Output looks like this:John      Lee            title     
        //The output which I want is:John      Lee       title
    }
}
//New class added representing the output format
[FixedLengthRecord(FixedMode.ExactLength)]
class OutputPerson
{
    [FieldFixedLength(10)]
    public string FirstName;

    [FieldFixedLength(10)]
    public string LastName;

    [FieldOptional]
    [FieldFixedLength(5)]
    public string Optional2;
}

[FixedLengthRecord(FixedMode.ExactLength)]
class Person
{
    [FieldFixedLength(10)]
    public string FirstName;
    [FieldFixedLength(10)]
    public string LastName;

    [FieldOptional]
    [FieldFixedLength(5)]
    public string Optional1;

    [FieldOptional]
    [FieldFixedLength(5)]
    public string Optional2;

    [FieldOptional]
    [FieldFixedLength(5)]
    public string Optional3;
}

请为您的问题提供一些代码。您能详细说明您试图输出的内容、输出数据的来源等吗?@Alfergon Hi我已经提供了一些code@Ceisc您好,我试图输出的数据源如上面的编码所示,我想省略可选1和可选3的空值空格。感谢您的回复,我已经尝试了您的代码,但无法执行我需要的操作。对不起,根据我上面的代码,您能给我进一步的建议吗?然后修改
AfterWrite()
以获取您需要的部分:
e.RecordLine=e.RecordLine.Substring(0,20)+e.RecordLine.Substring(25,5)
别忘了
Person
需要实现
INotifyWrite
否则将永远不会调用
后写。