解决 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();
}
我需要解析一个固定长度的 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();
}