9

こんな感じのデータが・・・

   1 TESTAAA      SERNUM    A DESCRIPTION
   2 TESTBBB      ANOTHR    ANOTHER DESCRIPTION
   3 TESTXXX      BLAHBL

私の質問は、何百もの行があるため、このデータをより小さな部分文字列に分割する最も効率的な方法は何かということです。また、一部の行では最後の列が欠落しています。正規表現を実行しようとしましたが、幅に使用したパターンでは成功しませんでした。上記のデータは、これらのフィールドに分割する必要があります (以下にリストされている各列の長さ)

{id} {firsttext} {serialhere} {description}
 4    22          6            30+

情報を抽出するために、誰かが手を貸したり、適切な正規表現一致パターンを提案したりできますか?

ありがとう、サイモン

4

3 に答える 3

8

次の正規表現を試してください。

(.{4})(.{22})(.{6})(.+)?

値が常に空ではなく、空白で区切られている (つまり、値が互いにぶつからない) 場合は、次のような単純なものを試してください。

line.Split(" ")
于 2012-07-06T15:54:07.603 に答える
6

実際には、 String.Substringを介して直接これを行うメソッドを作成することをお勧めします。これは、正確な必要な幅を提供する上でより効率的です。

これはうまくいく可能性があります (ただし、テストされておらず、意図的に文字列のパディングを削除していません):

public static string[] SplitFixedWidth(string original, bool spaceBetweenItems, params int[] widths)
{
    string[] results = new string[widths.Length];
    int current = 0;

    for (int i = 0; i < widths.Length; ++i)
    {
        if (current < original.Length)
        {
            int len = Math.Min(original.Length - current, widths[i]);
            results[i] = original.Substring(current, len);
            current += widths[i] + (spaceBetweenItems ? 1 : 0);
        }
        else results[i] = string.Empty;
    }

    return results;
}

とはいえ、これをStreamまたは テキスト ファイルから直接読み取る場合は、 TextFieldParserを使用すると、データを固定幅データとして直接読み取ることができます。

于 2012-07-06T15:46:37.897 に答える
6

MSDN で次のリンクを確認してください。

http://msdn.microsoft.com/en-us/library/zezabash.aspx

基本的に、TextFieldParserクラスはまさにこの種のことを行います。また、CSV ファイルなどの区切りデータを読み取るのにも最適な方法です。なんらかの理由で Microsoft はそれをMicrosoft.VisualBasic.FileIO名前空間の下に置くことを選択しましたが、これは VB とはまったく関係がないため厄介です。

たとえば、次のように使用できます。

TextFieldParser parser = new TextFieldParser(new StringReader(fixedWidthData));
parser.TextFieldType = FieldType.FixedWidth;
parser.SetFieldWidths(4, 22, 6, -1);
while (!parser.EndOfData)
{
    string[] row = parser.ReadFields();
}
于 2012-07-06T15:54:01.573 に答える