使用以下代码从文本文件中读取。
if (!allLines.Contains(":70"))
{
var firstIndex = allLines.IndexOf(":20");
var secondIndex = allLines.IndexOf(":23B");
var thirdIndex = allLines.IndexOf(":59");
var fourthIndex = allLines.IndexOf(":71A");
var fifthIndex = allLines.IndexOf(":72");
var sixthIndex = allLines.IndexOf("-}");
var firstValue = allLines.Substring(firstIndex + 4, secondIndex - firstIndex - 5).TrimEnd();
var secondValue = allLines.Substring(thirdIndex + 4, fourthIndex - thirdIndex - 5).TrimEnd();
var thirdValue = allLines.Substring(fifthIndex + 4, sixthIndex - fifthIndex - 5).TrimEnd();
var len1 = firstValue.Length;
var len2 = secondValue.Length;
var len3 = thirdValue.Length;
inflow103.REFERENCE = firstValue.TrimEnd();
pointer = 1;
inflow103.BENEFICIARY_CUSTOMER = secondValue;
inflow103.RECEIVER_INFORMATION = thirdValue;
}
else if (allLines.Contains(":70"))
{
var firstIndex = allLines.IndexOf(":20");
var secondIndex = allLines.IndexOf(":23B");
var thirdIndex = allLines.IndexOf(":59");
var fourthIndex = allLines.IndexOf(":70");
var fifthIndex = allLines.IndexOf(":71");
var sixthIndex = allLines.IndexOf(":72");
var seventhIndex = allLines.IndexOf("-}");
var firstValue = allLines.Substring(firstIndex + 4, secondIndex - firstIndex - 5).TrimEnd();
var secondValue = allLines.Substring(thirdIndex + 5, fourthIndex - thirdIndex - 5).TrimEnd();
var thirdValue = allLines.Substring(sixthIndex + 4, seventhIndex - sixthIndex - 5).TrimEnd();
var len1 = firstValue.Length;
var len2 = secondValue.Length;
var len3 = thirdValue.Length;
inflow103.REFERENCE = firstValue.TrimEnd();
pointer = 1;
inflow103.BENEFICIARY_CUSTOMER = secondValue;
inflow103.RECEIVER_INFORMATION = thirdValue;
}
以下是正在阅读的文本文件的格式。
{1:F21DBLNNGLAAXXX4695300820}{4:{177:1405260906}{451:0}}{1:F01DBLNNGLAAXXX4695300820}{2:O1030859140526SBICNGLXAXXX74790400761405260900N}{3:{103:NGR}{108:AB8144573}{115:3323774}}{4:
:20:SBICNG958839-2
:23B:CRED
:23E:SDVA
:32A:140526NGN168000000,
:50K:IHS PLC
:53A:/3000025296
SBICNGLXXXX
:57A:/3000024426
DBLNNGLA
:59:/0040186345
SONORA CAPITAL AND INVSTMENT LTD
:71A:OUR
:72:/CODTYPTR/001
-}{5:{MAC:00000000}{PAC:00000000}{CHK:42D0D867739F}}{S:{SPD:}{SAC:}{FAC:}{COP:P}}
上述文件格式表示单个文本文件中的一个事务,但在使用实时文件进行测试时,我遇到了一个文件可能有多个事务的情况。示例是以下代码。
{1:F21DBLNNGLAAXXX4694300150}{4:{177:1405231923}{451:0}}{1:F01DBLNNGLAAXXX4694300150}{2:O1031656140523FCMBNGLAAXXX17087957771405231916N}{3:{103:NGR}{115:3322817}}{4:
:20:TRONGN3RDB16
:23B:CRED
:23E:SDVA
:26T:001
:32A:140523NGN1634150,00
:50K:/2206117013
SUNLEK INVESTMENT LTD
:53A:/3000024763
FCMBNGLA
:57A:/3000024426
DBLNNGLA
:59:/0022617678
GOLDEN DC INT'L LTD
:71A:OUR
:72:/CODTYPTR/001
//BNF/TRSF
-}{5:{MAC:00000000}{PAC:00000000}{CHK:C21000C4ECBA}{DLM:}}{S:{SPD:}{SAC:}{FAC:}{COP:P}}${1:F21DBLNNGLAAXXX4694300151}{4:{177:1405231923}{451:0}}{1:F01DBLNNGLAAXXX4694300151}{2:O1031656140523FCMBNGLAAXXX17087957781405231916N}{3:{103:NGR}{115:3322818}}{4:
:20:TRONGN3RDB17
:23B:CRED
:23E:SDVA
:26T:001
:32A:140523NGN450000,00
:50K:/2206117013
SUNLEK INVESTMENT LTD
:53A:/3000024763
FCMBNGLA
:57A:/3000024426
DBLNNGLA
:59:/0032501697
SUNSTEEL INDUSTRIES LTD
:71A:OUR
:72:/CODTYPTR/001
//BNF/TRSF
-}{5:{MAC:00000000}{PAC:00000000}{CHK:01C3B7B3CA53}{DLM:}}{S:{SPD:}{SAC:}{FAC:}{COP:P}}
我的挑战是在我的代码中,在读取allLines时,每一行都是由某个索引标识的,我需要从文件中获取第二个事务,并且像以前一样存在相同的索引,我该怎么办?管理这种情况。
答案 0 :(得分:0)
您可以使用以下代码使用现有代码实现多个记录操作
//assuming fileText is all the text read from the text file
string[] fileData = fileText.Split('$');
foreach(string allLines in fileData)
{
//your code goes here
}
答案 1 :(得分:0)
这是一个被多余代码掩盖的简单问题。您所做的只是从一大块文本中提取3个值,其中精确的布局可以从一个块到另一个块不等。
我认为你需要做三件事。
不幸的是,这要求代码的抽象级别显着提升,这可能超出了您的准备范围。但是,如果您可以执行此操作并且(比方说)您将函数Extract()与正则表达式作为参数,则可以根据需要应用该函数一次,两次或根据需要处理基本事务中的变体。
答案 2 :(得分:0)
也许索引工作,但考虑到格式的特定结构,我高度怀疑这是一个很好的解决方案。但如果它对你有用,那就太棒了。您可以简单地拆分$
,然后将每个子字符串传递给方法。这可以确保每个子字符串的索引从条目的开头开始。
但是,如果遇到索引不再是静态的情况,那么在开始为任何格式编写解析器之前,首先需要了解格式。如果您没有任何文档并且基本上是逆向工程,那么您需要做什么。也许别人有规格。也许这些数据的来源在某处。但我会假设这些信息都不可用,并且你完成了一项绝对没有任何支持的任务,并且预计会对其进行逆向工程。
任何要由计算机解析和编写的格式都将在10次中完成。对于这个问题,我说9分(满分10分),因为在某些情况下,为了安全起见,人们会为此做出不必要的复杂事情。
当我查看您的示例数据时,我会看到" chunks"大括号内嵌的数据,以及嵌套的块。
例如,你有像
这样的东西{tag1:value1} // simple chunk
{tag2:{tag3: value3}{tag4:value4}} // nested chunk
多个交易显然由$
分隔。在这种情况下,您可以分为$
个符号,但您需要确保$
是一个特殊字符,并且不会出现在标记或值本身中。
不要注意什么是" chunk"是或为什么我使用这个词。您需要知道的是,有#34;标签"并且每个标签都带有特定的"值"。
值可以是任何值:诸如字符串或数字之类的原语,或者它可以是另一个块。这表明您需要首先确定每个标签接受的值的类型。例如,1
标记采用字符串。 4
标记占用多个块,可能代表不同的公司。像DLM
这样的块有一个空值。
从这两个示例中,我假设您需要使用每个块,检查标记,然后解析该值。由于存在嵌套块,您可能需要以特定方式存储它们才能正确处理它。