3

文字列配列にロードするテキストファイルがあります。ファイルの内容は次のようになります。

OTI * IA * IX *
NA〜REF * G1 * J EVERETTE〜REF
* 11 * 0113722462〜AMT
* GW * 229.8〜NM1
* QC * 1 * JENNINGS * PHILLIP〜OTI *
IA * IX * NA〜REF
* G1 * J EVERETTE〜REF
* 11 * 0113722463〜AMT
* GW *
127.75〜NM1 * QC * 1 * JENNINGS * PHILLIP〜OTI *
IA * IX *
NA〜REF * G1 * J EVERETTE〜REF
* 11 * 0113722462〜AMT
* GW * 10.99 〜NM1
* QC * 1 * JENNINGS * PHILLIP〜
..。

OTIで始まる行を探していますが、その後に「IA」が続く場合は、REF*11で始まる行から10桁の数字を取得する必要があります。これまでのところ、私はこれを持っています:

string[] readText = File.ReadAllLines("myfile.txt");

foreach (string s in readText) //string contains 1 line of text from above example
{
    string[] currentline = s.Split('*');

    if (currentline[0] == "OTI")
    {
        //move down 2 lines and grab the 10 digit
        //number from the line that starts with REF*11
    }
}

必要な行は、常に現在のOTI行の2行後です。現在の回線から2行下の回線にアクセスするにはどうすればよいですか?

4

8 に答える 8

4

を使用する代わりに、foreach()a を使用できます。for(int index = 0; index < readText.Length; index++) 次に、アクセスしている行がわかるので、簡単に言うことができます。int otherIndex = index + 2

string[] readText = File.ReadAllLines("myfile.txt");

for(int index = 0; index < readText.Length; index++)
{
    string[] currentline = readText[index].Split('*');

    if (currentline[0] == "OTI")
    {
        //move down 2 lines and grab the 10 digit
        //number from the line that starts with REF*11
        int refIndex = index + 2;
        string refLine = readText[refIndex];
    }
}
于 2012-10-29T17:34:40.373 に答える
2

This looks like an EDI file! Ahh, EDI, the memories...

The good news is that the EDI file is delimited, just like most CSV file formats. You can use any standard CSV file library to load the EDI file into a gigantic array, and then iterate through it by position.

I published my open source CSV library here, feel free to use it if it's helpful. You can simply specify the "asterisk" as the delimiter:

https://code.google.com/p/csharp-csv-reader/

// This code assumes the file is on disk, and the first row of the file
// has the names of the columns on it
DataTable dt = CSVReader.LoadDataTable(myfilename, '*', '\"');

At this point, you can iterate through the datatable as normal.

for (int i = 0; i < dt.Rows.Count; i++) {
    if (dt.Rows[i][0] == "OTI") {
        Console.WriteLine("The row I want is: " + dt.Rows[i + 2][0]);
    }
}
于 2012-10-29T17:37:53.833 に答える
2

どうですか:

string[] readText = File.ReadAllLines("myfile.txt");

for (int i = 0; i < readText.Length; i++)
{
    if (readText[i].StartsWith("OTI") && readText[i+2].StartsWith("REF*11")){
       string number = readText[i+2].Substring("REF*11".Length, 10);
       //do something 
    }
}
于 2012-10-29T17:43:27.547 に答える
1

正規表現を使用してアイテムをトークン化し、動的エンティティを作成する場合は、次のパターンがあります

string data = @"NM1*QC*1*JENNINGS*PHILLIP~
OTI*IA*IX*NA~
REF*G1*J EVERETTE~
REF*11*0113722463~
AMT*GW*127.75~
NM1*QC*1*JENNINGS*PHILLIP~
OTI*IA*IX*NA~
REF*G1*J EVERETTE~
REF*11*0113722462~
AMT*GW*10.99~
NM1*QC*1*JENNINGS*PHILLIP~";

string pattern = @"^(?<Command>\w{3})((?:\*)(?<Value>[^~*]+))+";

var lines = Regex.Matches(data, pattern, RegexOptions.Multiline)
                 .OfType<Match>()
                 .Select (mt => new
                 {
                    Op   = mt.Groups["Command"].Value,
                    Data = mt.Groups["Value"].Captures.OfType<Capture>().Select (c => c.Value)
                 }
                 );

これにより、ビジネスロジックを適用できる次のようなアイテムのリストが生成されます。

ここに画像の説明を入力してください

于 2012-10-29T18:50:09.023 に答える
0

System.Text.RegularExpressionsで定義されたRegex.MatchまたはRegex.Matchesを使用して正規表現の一致を使用しないのはなぜですか?Knuth-Morris-Prattアルゴリズムなどの文字列パターンマッチングアルゴリズムも確認できます。

于 2012-10-29T17:35:27.160 に答える
0
string[] readText = File.ReadAllLines("myfile.txt");
foreach (string s in readText) //string contains 1 line of text from above example
{
    string[] currentline = s.Split('*');

    if (currentline[0] == "REF"&&currentline[1] == "11")
    {
        found=false;
        needed=current+2;
    }
}
于 2012-10-29T17:35:55.293 に答える
0
string[] readText = File.ReadAllLines("myfile.txt");

for(int linenum = 0;linenum < readText.Length; linenum++) 
{
    string s = readText[linenum];

    string[] currentline = s.Split('*');

    if (currentline[0] == "OTI")
    {
        //move down 2 lines and grab the 10 digit
        linenum +=2;
        string refLine = readText[linenum];
        //number from the line that starts with REF*11

        // Extract your number here from refline

    }  
}
于 2012-10-29T17:42:04.900 に答える
0

みんなありがとう..これは私が思いついたものですが、私は何かを学ぶことを知っているので、あなたの答えも読んでいます! 再度、感謝します!

string[] readText = File.ReadAllLines("myfile.txt");

int i = 0;
foreach (string s in readText)
{
    string[] currentline = s.Split('*');

    if (currentline[0] == "OTI")
    {
        lbRecon.Items.Add(readText[i+2].Substring(8, 9));
    }
i++;
}
于 2012-10-29T17:53:47.297 に答える