2010-10-25 4 views
0

J'ai besoin de lire un bloc de données à partir de ce texte. Le bloc commence par la ligne T|DataObject.EShop.Tic.TicVente| et se termine par T|DataObject.EShop.Tic.TicPaiement|.comment puis-je lire un bloc spécifique à partir du fichier texte

Je ne veux que les lignes qui commencent par D entre les chaînes précédentes.

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| 

Répondre

0

Eh bien, vous pourriez trouver la première référence de T | DataObject, vérifiez qu'il est le type que vous recherchez, puis regardez la référence suivante T | DataObject.

On dirait que c'est juste une manipulation de chaîne simple.

Est-ce que tout ceci est sur une seule ligne ou bien l'en-tête de l'objet est-il séparé par des retours chariot?

MISE À JOUR
C'est certainement pas la meilleure façon de le faire et est juste une façon possible:

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

pourrait u écrire un code pour ce que j'ai essayé cuz beaucoup et rien fonctionne: S: S: S !!! ??? : s – user486848

+0

@ user486848: Veuillez vous abstenir d'utiliser "l33t" ou "text" speak ou tout autre dérivé. En plus d'avoir l'air d'avoir 12 ans, un certain nombre de personnes sur ce site sont des anglophones non-natifs et cela limite l'audience possible pour votre question. – NotMe

+0

okey bien thanx iam ganna essayer, et je suis juste un orateur anglais non-native – user486848

1

définir un indicateur indiquant que vous êtes à la recherche de votre chaîne de départ
lignes de lecture jusqu'à ce que vous trouvez votre chaîne de début (ou EOF)
définir un drapeau qui indique que vous recherchez la chaîne de fermeture
lire les lignes jusqu'à ce que vous trouviez votre chaîne de fin (ou EOF)
lors de la fin chaîne trouvée, indicateur défini que

imprimer toutes les lignes lues entre chaîne commençant et se terminant chaîne

2

Qu'en est-il des expressions régulières?

Vous avez dit:

commence dans "T | DataObject.EShop.Tic.TicVente |" ligne

Il commencera par "^ T | DataObject.EShop.Tic.TicVente | $"

Vous avez dit:

T | DataObject.EShop.Tic.TicPaiement |

Il se terminera par "$ T | DataObject.EShop.Tic.TicPaiement | $"

Que voulez-vous besoin? Chaque ligne commence par D? OK ... essayez ce

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

Ou vous pouvez facilement analyser

+0

s'il vous plaît pardonnez-moi si la regex ne fonctionne pas sur le premier coup, je l'ai écrit à la main.Je commence à penser qu'il devrait être réparé parce qu'il littéralement co-traite les lignes pour commencer avec D, à défaut dans votre cas. Une meilleure regex peut être faite avec l'aide d'autres experts, mais j'espère que je vous mets dans la bonne direction. –

+0

mais si j'ai une nouvelle ligne, comment puis-je écrire le nouveau motif de ligne – user486848

Questions connexes