解决 FileHelpers C# 中的 BadUsage 异常

SolvingBadUsage Exception in FileHelpers C#

我需要解析一个固定长度的 txt 文件并将其转换为 XML。为此,我正在尝试使用文件助手库。

我的 txt 文件看起来有点像这样。列之间有正确数量的空格。 Whosebug 已删除它们,文本文件也无法在此处发布,所以这是我能做的最好的了。

00000265287331ON      Gaurav lath                                                                                                                              WVWDM9AJ3BW054510         665300313                                          20160111                       

00000265412333AB      Kritin Kapoor                                                                                                                            WVWBA7AJ5AW423323         10100510855                                        20160111                       

00000265409491BC      Gary Kasprov                                                                                                                             WVWMN9AN2AE538477         773713F                                            20160111                       

00000265723428ON      ASBDHJW                                                                                                                                  3VWDX7AJ5BM008640         666760743                                          20160111                       

00003245782928AB      Damn bruh                                                                                                                                3VWDX7AJ7BM008526         10101931403                                        20160111                       

12345665842041NB      Ayeyeyeye Yoyoyoy                                                                                                                        3VWDX7AJ4BM317970         19498690                                           20160111                       

09876565877284ON      Sample Name                                                                                                                              3VWLX7AJ0BM004748         665727399                                          20160111                       

76542365887122AB      Dragutiin ivanovic                                                                                                                       WVWCA7AJ7BW072789         10102120532                                        20160111                       

09843266079601BC      Wayne Rooney                                                                                                                             3VW3L7AJ4BM014663         837089F                                            20160111                       

23049466096203SK      John Terry                                                                                                                               3VWBK7AJXBM311645         300656416                                          20160111 

我的主图是这样的

 static void Main(string[] args)
    {


        var engine = new FixedFileEngine<VWDischargeTXT>();
        VWDischargeTXT[] result = engine.ReadFile("C:\Users\GL1676\Desktop\CSRSDischarge01112016.txt");

        foreach (var detail in result)
            Console.WriteLine(" AcctNum: {0},  Province: {1}", detail.AcctNum, detail.province);

        Console.Read();
    }

每当我 运行 程序时,都会打开一个新的窗口,突出显示文件的路径并显示

BadUsageException was unhandled. End Of Line found processing the field: XYZ at line 2. (You need to mark it as [FieldOptional if you want to avoid this exception])

当我将字段添加为可选字段时(即使它在任何方面都不是可选的并且实际上非常重要)时还有很多其他错误。

编辑: 这是 VWDischargeTXT

的定义
[FixedLengthRecord()]
class VWDischargeTXT
{
    [FieldFixedLength(14)]
    public int AcctNum;

    [FieldFixedLength(8)]
    [FieldTrim(TrimMode.Right)]
    public char province;

    [FieldFixedLength(126)]
    [FieldTrim(TrimMode.Right)]
    public char CustomerName;

    [FieldFixedLength(26)]
    [FieldTrim(TrimMode.Right)]
    public char VIN;

    [FieldFixedLength(51)]
    [FieldTrim(TrimMode.Right)]
    public char RegNo;

    [FieldFixedLength(31)]
    [FieldTrim(TrimMode.Right)]
    [FieldConverter(ConverterKind.Date, "yyyyMMdd")]
    public DateTime DischargeDate;
}

正如您所指出的,您的问题中的间距看起来有点偏差。我编辑它只是为了将数据格式化为代码,它看起来格式正确(看起来间隔很好)。

基于此修改,我修改了您的 VWDischargeTXT class,以便它可以处理数据。变成

[FixedLengthRecord(FixedMode.AllowLessChars)]
[IgnoreEmptyLines]
class VWDischargeTXT
{
    [FieldFixedLength(14)]
    public long AcctNum;

    [FieldFixedLength(8)]
    [FieldTrim(TrimMode.Right)]
    public string province;

    [FieldFixedLength(137)]
    [FieldTrim(TrimMode.Right)]
    public string CustomerName;

    [FieldFixedLength(26)]
    [FieldTrim(TrimMode.Right)]
    public string VIN;

    [FieldFixedLength(51)]
    [FieldTrim(TrimMode.Right)]
    public string RegNo;

    [FieldFixedLength(31)]
    [FieldTrim(TrimMode.Right)]
    [FieldConverter(ConverterKind.Date, "yyyyMMdd")]
    public DateTime DischargeDate;
}

一些注意事项:

    添加
  • FixedMode.AllowLessChars 以修复抛出的错误 抱怨第 11 行的 DischargeDate 字段。这可能只是 是问题中数据的格式。
  • 添加了
  • IgnoreEmptyLines 以跳过空白行。这些空白可能只是它被粘贴到问题中的方式。
  • AcctNum 的定义已更改为 long,因为它太大而无法转换为 int
  • 您的 char 字段已更改为 string,因为 char 仅用于单个字符。
  • CustomerName 的字段长度已从 126 更改为 137 以匹配数据。

如果您想测试,我已经更新了您的代码以显示所有字段

    static void Main(string[] args)
    {
        var engine = new FixedFileEngine<VWDischargeTXT>();
        VWDischargeTXT[] result = engine.ReadFile("C:\Users\GL1676\Desktop\CSRSDischarge01112016.txt");

        foreach (var detail in result)
            Console.WriteLine(" AcctNum: {0},  Province: {1}, CustomerName: {2}, VIN: {3}, RegNo: {4}, DischargeDate: {5}",
                detail.AcctNum, detail.province, detail.CustomerName, detail.VIN, detail.RegNo, detail.DischargeDate);

        Console.Read();
    }