简体   繁体   English

我如何从文本文件中读取特定的块

[英]how can i read specific block from text file

I need to read a block of data from this text. 我需要从此文本中读取数据块。 The block starts with the T|DataObject.EShop.Tic.TicVente| 该块以T|DataObject.EShop.Tic.TicVente|开头T|DataObject.EShop.Tic.TicVente| line and ends with T|DataObject.EShop.Tic.TicPaiement| 行并以T|DataObject.EShop.Tic.TicPaiement|结尾 .

I only want the lines that start with D between the previous strings. 我只希望前面的字符串之间以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|

What about Regular Expressions? 那正则表达式呢?

You said: 你说:

starts in "T|DataObject.EShop.Tic.TicVente|" 从“ T | DataObject.EShop.Tic.TicVente |”开始 line 线

So it will begin with "^T|DataObject.EShop.Tic.TicVente|$" 因此它将以“ ^ T | DataObject.EShop.Tic.TicVente | $”开头

You said: 你说:

T|DataObject.EShop.Tic.TicPaiement| T | DataObject.EShop.Tic.TicPaiement |

So it will end with "$T|DataObject.EShop.Tic.TicPaiement|$" 因此它将以“ $ T | DataObject.EShop.Tic.TicPaiement | $”结尾

What else do you need? 你还需要什么? Each line starts with D? 每行以D开头? OK... try this 好...试试看

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

Or you can easily parse 或者您可以轻松解析

set a flag indicating you are searching for your starting string 设置一个标志,指示您正在搜索起始字符串
read lines until you find your start string (or EOF) 读取行,直到找到起始字符串(或EOF)
set a flag that indicates you are searching for the closing string 设置一个标志,指示您正在搜索结束字符串
read lines until you find your ending string (or EOF) 读取行,直到找到结尾字符串(或EOF)
when ending string found, set flag that 找到结束字符串时,设置标志

print all lines read between starting string and ending string 打印在开始字符串和结束字符串之间读取的所有行

Well, you could find the first reference of T|DataObject, verify that it is the type you are looking for, then look for the next reference of T|DataObject. 好了,您可以找到T | DataObject的第一个引用,确认它是您要查找的类型,然后寻找T | DataObject的下一个引用。

Seems like it's just some simple string manipulation. 似乎只是一些简单的字符串操作。

Is all of this on a single line or are the object header separated by carriage returns as well? 是所有这些都放在一行上还是对象标头也由回车分隔?

UPDATE 更新
This is by no means the best way to do this and is just one possible way: 这绝不是最好的方法,而只是一种可能的方法:

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);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM