【问题标题】:How to parse for specific data from a text file C# visual studio如何从文本文件 C# Visual Studio 中解析特定数据
【发布时间】:2021-04-19 18:12:33
【问题描述】:

我正在尝试使用以下数据解析文本文件:


A1       COMPANY NAME      COMPANY NAME                                                                    Total Due:     $40,374.56

    Type..Tr Date.Source Doc.Description....Terms..Original Amt......Amount Rem
       1 01/05/21 061775     Invoice          T6      $3,009.71     $3,009.71  
       1 01/08/21 061803     USMMMKTX7F       T6      $2,884.00     $2,884.00  

    Debit Total :         $17,195.04         $17,285.81          $5,893.71               $.00               $.00         $40,374.56
-----------------------------------------------------------------------------------------------------------------------------------
A1       AAL01           SOMETHING INDUSTRIES INC.                                                          Total Due:     $10,879.70

    Type..Tr Date.Source Doc.Description....Terms..Original Amt......Amount Rem
       1 02/04/21 061957     Invoice          T1      $3,641.90     $3,641.90  
       1 02/11/21 062002     75094100         T1      $4,546.70     $4,546.70  
       1 03/04/21 062128     75094270         T1      $2,691.10     $2,691.10  

    Debit Total :          $7,237.80          $3,641.90               $.00               $.00               $.00         $10,879.70
-----------------------------------------------------------------------------------------------------------------------------------
A1       ACS01           ALPHA HEALING SYSTEMS                                                          Total Due:      $5,334.20

    Type..Tr Date.Source Doc.Description....Terms..Original Amt......Amount Rem
       1 02/25/21 062076     Invoice          T1      $5,334.20     $5,334.20  

需要以某种方式组织数据,以便仅显示公司名称、交易日期、来源 ID 和收到的金额。可以忽略此文本文件中的所有其他内容。

例子:

[Company Name]    [Transaction Date][SourceID][Amount Received]
COMPANY NAME               01/05/21   061775   $3,009.71   
COMPANY NAME               01/08/21   061803   $2,884.00
SOMETHING INDUSTRIES INC.  02/04/21   061957   $3,641.90
SOMETHING INDUSTRIES INC.  02/11/21   062002   $4,546.70
ALPHA HEALING SYSTEMS      02/25/21   062076   $5,334.20

我已经尝试在 google 和 stackoverflow 上研究可能的解决方案,似乎使用正则表达式是解决这个问题的一般方向。需要解决的问题是如何跳过文本文件中所有多余的字符和符号,只获取需要的数据。实现这一目标的最佳方法是什么?

【问题讨论】:

  • 哇...呃,您是从哪里以及如何获得这些打印输出的?
  • 文件很可能是使用固定宽度字段规则生成的,您只需要弄清楚这一点。与创建文件的人交谈,了解文件的格式。
  • 是的,我也会使用固定宽度解析。看起来您有六种不同的记录格式要处理:标题/子标题/详细信息/总计等,因此finite state machine 可能是一个好方法。这并不难,但以这种格式解析数据非常耗时且极其脆弱。坦率地说,一个完整的 PITA。

标签: c# visual-studio parsing


【解决方案1】:

我不得不处理一个非常相似的问题,即通过 SSH 从服务器输出。我为克服如此糟糕的输出所做的并不是最漂亮的工作,但它很实用。首先我将文件加载到一个字符串中,然后逐行读取替换逗号的空格量,输出是一个新的 CSV 字符串。这样我就可以更轻松地操纵这些值。

这是我所做的一部分。也许对你有帮助。

                string line = sreader.ReadLine();
                while (line != null) // create a csv file
                {
                    if (line.Contains("CO  --"))
                    {
                        line = Regex.Replace(line, @"\s\s\s+", ",");
                        CSV += line + "\r\n";
                        line = sreader.ReadLine();
                    }
                    else
                    {
                        line = Regex.Replace(line, @"\s\s+", ",");
                        CSV += line + "\r\n";
                        line = sreader.ReadLine();
                    }
                }

正如您在上面看到的,有些行我需要替换 3 个空格,而其他行只需要替换 2 个。

【讨论】:

    【解决方案2】:

    使用 Contain() 和 Substring() 方法的简单解析器。

    StreamReader sr = new StreamReader(sFileNameOpen);
                    
    while (sr.Peek() >= 0)
    {
        string line = sr.ReadLine();
        line = line.Trim();
        if (line.ToString() == "" || line.Contains("=======") || line.Contains("A R") || line.Contains("RPC") || line.Contains("--------") || line.Contains("AR Code..") || line.Contains("........") || line.Contains("Last Posting Number:") || line.Contains("Type..") || line.Contains("Grand") || line.Contains("Debit"))
            continue; //skip
    
        if (line.Contains("Total Due: "))
        {
            customerId = line.Substring(9, 16).Trim();
            custName = line.Substring(25, 41).Trim(); 
            continue;
        }
                        
        if (line.Contains("T0") || line.Contains("T1") || line.Contains("T2") || line.Contains("T3") || line.Contains("T4") || line.Contains("T5") || line.Contains("T6") || line.Contains("T7"))
        {
            txnDate = line.Substring(2, 8).Trim();
            txnNum = line.Substring(11, 6).Trim();
            AmountRemaining = line.Substring(60, 10);
        }
    }                    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多