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

最初に 4 行ごとに 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));

次に、バッファー内の各エントリを実際に 1 行であるかのように解析できます。これは、正規表現または文字列部分文字列のみを使用して簡単に実行できます。行をまたいで実行するよりもはるかに簡単です。

上記のコードは最もクリーンではありませんが、機能します。

于 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 に答える