我怎样才能从文本文件中读取特定块

时间:2010-10-25 19:51:23

标签: c#

我需要阅读本文中的数据块。该块以T|DataObject.EShop.Tic.TicVente|行开头,以T|DataObject.EShop.Tic.TicPaiement|结尾。

我只想要在前面的字符串之间以D开头的行。

W|301500120100407213036|

M|SYP||

T|DataObject.EShop.Tic.TicVente|

C|ArtId|ArtRef|PrxInit|QteArt|PrxEntId|TvaId|TvaTaux|RetourId|RetourMagAchat|RetourTicExtIdAchat|RetourDatAchat|PosteNum|TicId|LigNum|PrxAppel|PrxPaye|DatMaj|

D|18250168145|1825016814503131|1690|-1|0934489998|1|0|C|150||20100406000000|1|009700001|1|1690|1690|20100407093455|

D|18250137020|1825013702002161|750|1|1002689999|1|0|||||1|009700001|2|750|750|20100407093455|

D|18260013233|1826001323336111|1990|1|0935689998|1|0|||||1|009700002|1|1990|1990|20100407103918|
T|DataObject.EShop.Tic.TicPaiement|

C|PosteNum|TicId|LigNum|PaieId|Mnt|DevId|MntDev|Info1|Info2|TransId|TransOK|DatMaj|

D|1|009700001|1|01|-940|SYP|-940|||||20100407093455|

D|1|009700002|1|01|4000|SYP|4000|||||20100407103918|
T|DataObject.EShop.Tic.TicVenteAnnulee|

C|PosteNum|Dat|SessId|CliTypId|CliId|UtilId|LotId|ArtId|ArtRef|PrxInit|QteArt|PrxEntId|TvaId|TvaTaux|RetourId|RetourMagAchat|RetourTicExtIdAchat|RetourDatAchat|TicId|LigNum|PrxAppel|PrxPaye|DatMaj|

D|1|20100407105721|0097001|||6|0150010097763|18250040037|1825004003704121|990|1|1002689999|1|0|||||009700004|1|990|990|20100407213033|T|DataObject.EShop.Tic.TicVenteAnnulee|

C|PosteNum|Dat|SessId|CliTypId|CliId|UtilId|LotId|ArtId|ArtRef|PrxInit|QteArt|PrxEntId|TvaId|TvaTaux|RetourId|RetourMagAchat|RetourTicExtIdAchat|RetourDatAchat|TicId|LigNum|PrxAppel|PrxPaye|DatMaj|

D|1|20100407105721|0097001|||6|0150010097763|18250040037|1825004003704121|990|1|1002689999|1|0|||||009700004|1|990|990|20100407213033|

3 个答案:

答案 0 :(得分:2)

正则表达式怎么样?

你说:

  

以“T | DataObject.EShop.Tic.TicVente |”开头线

所以它将以“^ T | DataObject.EShop.Tic.TicVente | $”

开头

你说:

  

T | DataObject.EShop.Tic.TicPaiement |

所以它将以“$ T | DataObject.EShop.Tic.TicPaiement | $”结束

你还需要什么?每行以D开头?好的......试试这个

Regex rgx = new Regex("^T|DataObject.EShop.Tic.TicVente|$(D[.]*)$T|DataObject.EShop.Tic.TicPaiement|$", RegexOptions.MultiLine);

或者您可以轻松解析

答案 1 :(得分:1)

设置一个标志,表示您正在搜索起始字符串
读取行直到找到起始字符串(或EOF)
设置一个标志,表示您正在搜索结束字符串
读取行直到找到结束字符串(或EOF)
当结束字符串找到时,设置标志为

打印在起始字符串和结束字符串之间读取的所有行

答案 2 :(得分:0)

好吧,您可以找到T | DataObject的第一个引用,验证它是您要查找的类型,然后查找T | DataObject的下一个引用。

似乎只是一些简单的字符串操作。

所有这些都在一行上,还是由回车符分隔的对象标题?

<强>更新
这绝不是最好的方法,只是一种可能的方式:

String sRecords = "T|DataObject.Test|C|RecordHeaderId|D|123|D|234|T|DataObject.Test2|C|RecordHeaderId|D|2345|D2366";

// this will split the string into an array on the boundary of |.
// which means you'll have all of item individual items separated out.
String[] sArray = sRecords.Split('|');
List<String> objects = new List<string>();
String obj = String.Empty;

foreach (String s in sArray) {
    // locate the T item which defines a new record definition.  
    // the danger is if your data contains a "T" value somewhere it shouldn't
    if (s.Equals("T") && !String.IsNullOrEmpty(obj)) {
        objects.Add(obj);
        obj = String.Empty;
    }
    obj = String.Format("{0}|{1}", obj, s);
}
objects.Add(obj);

// at this point "objects" hold a list of strings, each defined by the record type.
foreach (String s in objects) {
    listBox1.Items.Add(s);
}