0

基本上,

我有想要从文本块中吐出的文本。但是,我大部分都保留了正则表达式,它要么太少[跳过一节],要么太多[阅读下一节的一部分]。它基本上需要阅读我从银行对账单中提取的文本。我已经尝试过更多地阅读正则表达式,但是我仍然不知道该怎么做。

下面是一些示例,让你们了解我正在尝试做的事情。

_4XXXXXXXXXXXXXX9_
_SOU THE HOME DEPOT 431      POMPANO BEACH * FL
AUT  020112 DDA PURCHASE_
_2/1_DEBIT POS_3.15_

下划线基本上是我要提取的部分。基本上除了 DEBIT POS 之外的所有东西。

我正在使用的正则表达式是:

\A
(?<SerialNumber>\b[0-9]{13,16}\b)
(?<Description>.) 'PROBLEM HERE'
(?<PostingDate>
(?:1[0-2]|[1-9])/(?:3[01]|[12][0-9]|[1-9]))
(?<Amount>[,0-9]+\.[0-9]{2})
\Z

我无法将描述设置为任何长度的字符,因为我不知道文本部分的最大长度。我也不知道是2行描述还是1行。这主要让我感到困惑。

4

2 回答 2

1

我想你想先将每四行连接在一起作为一行:

var file = @"C:\temp.txt";
var lines = System.IO.File.ReadAllLines(file);
var buffer = new List<String>();

for (var i = 0; i < lines.Length; i++ )
{
    if (i % 4 == 0) { buffer.Add(""); }
    buffer[buffer.Count - 1] += lines[i] + " ";
}

buffer.ForEach(b => Console.WriteLine(b));

然后,您实际上可以解析缓冲区中的每个条目,就好像它是一行一样。这可以使用正则表达式或字符串子字符串轻松完成。比尝试跨行更容易。

上面的代码不是最干净的,但它可以工作。

于 2012-04-11T23:58:22.090 回答
0

看起来像不使用正则表达式的另一个简单答案。File.ReadAllLines()如果每一个都是行,那么解析每一行 就不会那么难了。

public class Order
{
  public string SerialNumber { get; set; }
  public string Description { get; set; }
  public DateTime PostingDate { get; set; }
  public Decimal Amount { get; set; }

  public void SetSerialNumberFromRaw(string serialNumber)
  {
    // Convert to required type, etc.
    this.SerialNumber = <someConvertedValue>;
  }
  public void <OtherNeededValueConverters>
}    

List<string> lines = File.ReadAlllines("<filename").ToList();
List<Order> orders = new List<Order>();

Order currentOrder = null;
foreach (string line in lines)
{
  if (currentOrder = null)
  {
    currentOrder = new Order();
    orders.Add(currentOrder);
    currentOrder.SetSerialNumberFromRaw(line);
  }
  else
  {
    if (line.Contains("DEBIT POS", CultureInfo.CurrentCultureIngoreCase))
    { 
      currentOrder.SetPostingDateAndAmount(line);
      currentOrder = null;
    }
    else
    {
      currentOrder.SetAppendDescription(line);
    }
  }
}
于 2012-04-11T23:42:24.533 回答