使用c#从文本文件中读取

时间:2014-05-26 10:28:09

标签: c#

使用以下代码从文本文件中读取。

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时,每一行都是由某个索引标识的,我需要从文件中获取第二个事务,并且像以前一样存在相同的索引,我该怎么办?管理这种情况。

3 个答案:

答案 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个值,其中精确的布局可以从一个块到另一个块不等。

我认为你需要做三件事。

  1. 重构代码。而不是内联的两个大块if,你需要提取所需文本的函数。
  2. 使用正则表达式。单个正则表达式可以在一行而不是几行中提取所需的值。
  3. 将代码与数据分开。这两个块的逻辑是相同的,只有数据发生变化。因此,编写一个函数并传入提取所需数据项所需的正则表达式。
  4. 不幸的是,这要求代码的抽象级别显着提升,这可能超出了您的准备范围。但是,如果您可以执行此操作并且(比方说)您将函数Extract()与正则表达式作为参数,则可以根据需要应用该函数一次,两次或根据需要处理基本事务中的变体。

答案 2 :(得分:0)

也许索引工作,但考虑到格式的特定结构,我高度怀疑这是一个很好的解决方案。但如果它对你有用,那就太棒了。您可以简单地拆分$,然后将每个子字符串传递给方法。这可以确保每个子字符串的索引从条目的开头开始。

但是,如果遇到索引不再是静态的情况,那么在开始为任何格式编写解析器之前,首先需要了解格式。如果您没有任何文档并且基本上是逆向工程,那么您需要做什么。也许别人有规格。也许这些数据的来源在某处。但我会假设这些信息都不可用,并且你完成了一项绝对没有任何支持的任务,并且预计会对其进行逆向工程。

任何要由计算机解析和编写的格式都将在10次中完成。对于这个问题,我说9分(满分10分),因为在某些情况下,为了安全起见,人们会为此做出不必要的复杂事情。

当我查看您的示例数据时,我会看到" chunks"大括号内嵌的数据,以及嵌套的块。

例如,你有像

这样的东西
{tag1:value1} // simple chunk
{tag2:{tag3: value3}{tag4:value4}} // nested chunk

多个交易显然由$分隔。在这种情况下,您可以分为$个符号,但您需要确保$是一个特殊字符,并且不会出现在标记或值本身中。

不要注意什么是" chunk"是或为什么我使用这个词。您需要知道的是,有#34;标签"并且每个标签都带有特定的"值"。

值可以是任何值:诸如字符串或数字之类的原语,或者它可以是另一个块。这表明您需要首先确定每个标签接受的值的类型。例如,1标记采用字符串。 4标记占用多个块,可能代表不同的公司。像DLM这样的块有一个空值。

从这两个示例中,我假设您需要使用每个块,检查标记,然后解析该值。由于存在嵌套块,您可能需要以特定方式存储它们才能正确处理它。