textdatei lesen,bearbeiten und wieder in neue textdatei schreiben
-
beim 2. Vergleich fehlt etwas:
if( Memo1->Lines->Strings[ i].Pos("H200348000000000000002483") > 0 && Memo1->Lines->Strings[ i].Pos("ATRRIB FS=30DB") > 0 )
-
sorry das hab ich vergessen zu kopieren! war aber drin ! und ging nicht!
-
gibt es das in dieser Kombination im Text überhaupt? in einer Zeile?
-
ich habs
for( int i = 0; i < Memo1->Lines->Count; i++ ) { if( Memo1->Lines->Strings[i].Pos("H200348000000000000002483") > 0 && Memo1->Lines->Strings[i+1].Pos("Vortest W30 AT_P5") > 0 && Memo1->Lines->Strings[i+1].Pos("ATTRIB FS=30DB")) { a++; } } Label1->Caption=a;
Er hat in dem Memo eine Zeile der Textdatei auf zwei Zeilen verteilt.. deswegen i+1.
Jetzt dürfen nur die Sammary´s nicht gezählt werden. Kann man in die IF-Abfrage ein != "ungleich" eibauen !? Wenn ja an welche Stelle ?
Liebe Grüße
Tobias
-
So wie ich das sehe suchst du nach einer Möglichkeit die einzelnen Strings zu zerlegen und mit den einzelnen Value`s dann was anzustellen. Mal aus der Hüfte geschossen würd ich das so machen...
Schmeiss dir ein TMemo und nen TButton auf ne Form und probiers mal so.
TStringList *pListe = new TStringList(); // deine zu ladende Datei pListe->LoadFromFile("test.txt"); // erste Zeile der kompletten Datei anzeigen Memo1->Lines->Add(pListe->Strings[0]); // Detail Liste bauen TStringList *pListeDetail = new TStringList(); // es gibt da die "ominöse" Sache names 'CommaText' die genau // das macht was du brauchst // das Trennzeichen feytlegen pListeDetail->Delimiter = ','; // auf true setzen, sonst wird auch bei Leerzeichen und Umbrüchen geteilt pListeDetail->StrictDelimiter = true; // splitten pListeDetail->CommaText = pListe->Strings[0]; // Jetzt kannst du die einzelnen Listen Memo1->Lines->Add("=======alle TeilStrings einzeln der Zeile [0] ======="); // und noch fix alle TeilStrings der ersten Zeile aus deiner Datei anzeigen for(int i = 0; i < pListeDetail->Count; i++ ){ Memo1->Lines->Add("TeilString [" + IntToStr(i) + "] : "+ pListeDetail->Strings[i]); // ... was mit den superduperoberkrasstollen Teilstrings machen ... } // Listen hinterher löschen nicht vergessen ;) delete pListeDetail; delete pListe;
so kommst du ganz einfach an jeden Teilstring der in der Datei steht und kannst die nach belieben verwursten.
MfG
TFX
-
StrictDelimiter gibt es definitiv beim Builder 6 noch nicht.
-
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String dateiname="datei.txt";
String tag="H2003480000000000000024BB";
String vortest="Vortest W0 AT_P7";
String attrib="ATTRIB FS=27DB";
int count=0;
TStringList *datei=new TStringList();
datei->LoadFromFile(dateiname);
for(int i=0;i<datei->Count;i++)
{
if(datei->Strings[i].Pos(tag)&&datei->Strings[i].Pos(vortest)&&datei->Strings[i].Pos(attrib)) count++;
}
delete datei;
Label1->Caption = IntToStr(count);
}
-
void __fastcall TForm1::Button1Click(TObject *Sender) { String dateiname="datei.txt"; String tag="H2003480000000000000024BB"; String vortest="Vortest W0 AT_P7"; String attrib="ATTRIB FS=27DB"; int count=0; TStringList *datei=new TStringList(); datei->LoadFromFile(dateiname); for(int i=0;i<datei->Count;i++) { if(datei->Strings[i].Pos(tag)&&datei->Strings[i].Pos(vortest)&&datei->Strings[i].Pos(attrib)) count++; } delete datei; Label11->Caption = IntToStr(count); }
-
chamod schrieb:
StrictDelimiter gibt es definitiv beim Builder 6 noch nicht.
dann entferne die Leerzeichen und Zeilenumbrüche halt von Hand und lass den StrikDelimiter weg. Ist doch das selbe in grün...
MfG
TFX
-
Hallo ihr Lieben,
erstmal vielen vielen Dank für eure Hilfe!!
Das Programm von chronol funktioniert gut. Das andere Läuft wegen StrictDelimeter nicht. Und da es sich um große Datenmengen handelt, ist mir das mit dem einzelnen rauslöschen zu umständlich.Jetzt muss ich noch wissen wie ich die Punkte A1-A6 B1-B6 usw in eine Variable bekomme und alle diese Punkte auslesen.
Kann ich in einen String A1,A2,A3 usw schreiben und dann mit string[1] z.B. A1 lesen?Wenn der Tag und Attrib gwählt sind muss ich alle Punkte von A1-A6 - F1-F6 erfassen und pro Punkt jeweils ermitteln wie oft der Tag mit dem Attrib 30DB gefunden wurde.
Die Tag´s und Attrib DB habe ich bereits in einer Combo bzw Checkbox.Sobald das Programm fertig ist stelle ich das sofort zur Verfügung. Vll kann der/die ein oder andere es ja noch gebrauchen
Liebe Grüße
Tobias
-
Mal ein kleines Update
String dateiname="ScriptMode_IDLog.txt"; String PB1="B1",PB2="B2",PB3="B3",PB4="B4",PB5="B5",PB6="B6",PCD1="CD1",PCD2="CD2",PCD3="CD3",PCD4="CD4",PCD5="CD5",PCD6="CD6",PE1="E1",PE2="E2",PE3="E3",PE4="E4",PE5="E5",PE6="E6"; int B1=0,B2=0,B3=0,B4=0,B5=0,B6=0,CD1=0,CD2=0,CD3=0,CD4=0,CD5=0,CD6=0,E1=0,E2=0,E3=0,E4=0,E5=0,E6=0; TStringList *datei=new TStringList(); datei->LoadFromFile(dateiname); for(int i=0;i<datei->Count;i++) { if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PB1)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) B1++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PB2)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) B2++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PB3)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) B3++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PB4)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) B4++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PB5)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) B5++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PB6)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) B6++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PCD1)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) CD1++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PCD2)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) CD2++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PCD3)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) CD3++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PCD4)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) CD4++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PCD5)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) CD5++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PCD6)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) CD6++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PE1)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) E1++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PE2)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) E2++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PE3)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) E3++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PE4)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) E4++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PE5)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) E5++; if(datei->Strings[i].Pos(ComboBox1->Items->Strings[ComboBox1->ItemIndex])&&datei->Strings[i].Pos(PE6)&&datei->Strings[i].Pos("ATTRIB FS="+RadioGroup1->Items->Strings[RadioGroup1->ItemIndex])) E6++; } delete datei; Label1->Caption=IntToStr(B1)+" "+IntToStr(CD1)+" "+IntToStr(E1); Label2->Caption=IntToStr(B2)+" "+IntToStr(CD2)+" "+IntToStr(E2); Label3->Caption=IntToStr(B3)+" "+IntToStr(CD3)+" "+IntToStr(E3); Label4->Caption=IntToStr(B4)+" "+IntToStr(CD4)+" "+IntToStr(E4); Label5->Caption=IntToStr(B5)+" "+IntToStr(CD5)+" "+IntToStr(E5); Label6->Caption=IntToStr(B6)+" "+IntToStr(CD6)+" "+IntToStr(E6); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ComboBox1->Clear(); ComboBox1->Items->LoadFromFile("tag.txt"); //In der tag.txt stehen alle bekannten Tags ComboBox1->ItemIndex=0; }
Ich habe in der RadioGrpou1 die DB´s drin stehen.
Was mir jetzt noch fehlt ist das er den Summary nicht liest.
Wie kann ich es realisieren das er diese Zeilen nicht liest?Und das am besten nur einmal und nicht in jeder Abfrage..Wahrscheinlich geht das noch viel schöner... aber besser bekomm ich es nicht hin
Wenn das Programm fertig ist werde ich es auf jedenfall zu Verfügung stellen.Vll kann der/die ein oder andere es ja noch gebrauchen.Gruß
Tobias
-
Ich bins nochmal
Ich müsste mal noch wissen wie ich es hinbekommen in der StringList die Anzahl der , in einer Zeile der Texdatei zu lesen, und ab einem bestimmten Wert den nach dem Komma folgenden Text auszulesen.
Das mit dem Summary habe ich einfach gelöst in dem ich die Anzahl -1 rechne.Da der jeweilige Tag auch nur im Sammary steht wenn er mindestens einmal gefunden wurde.
Liebe Grüße
Tobias
-
Die Position von dem "bestimmten Wert" bekommst du doch auch mit 'Pos', ohne jetzt die Kommas zu zählen.
Dann brauchst du nur von dort an nach den nächsten Kommas suchen.String line="0,38,2,192.168.0.10,H2003480000000000000024B0,38,1,ATTRIB ANTS=1,ATTRIB SESSION=1,ATTRIB IDTIMEOUT=100,ATTRIB SCHEDOPT=0,ATTRIB TAGTYPE=EPCC1G2,ATTRIB NOTAGRPT=1,ATTRIB WRTRIES=3,ATTRIB DENSEREADERMODE=0,Vortest W0 AT_P7,ATTRIB FS=27DB,"; int pos = line.Pos("ATTRIB ANTS"); pos += line.SubString(pos,line.Length()-pos).Pos(","); Label1->Caption = line.SubString(pos,line.SubString(pos,line.Length()-pos).Pos(",")-1);
-
hallo chronol,
das ist genau das was ich gesucht habe!Nur würde ich gerne nich in einem String sondern immer in der 2. Zeile einer txt-Datei suchen.
Ich habe es so gelöst:String dateiname=Edit1->Text+".txt"; TStringList *datei=new TStringList(); if(FileExists(dateiname)) { ShowMessage("Dateiname richtig"); datei->LoadFromFile(dateiname); for(int i=0;i<datei->Count;i++) { if(i==2) { int pos = datei->Strings[i].Pos("DENSEREADERMODE"); pos += datei->Strings[i].SubString(pos,datei->Strings[i].Length()-pos).Pos(","); Edit2->Text = datei->Strings[i].SubString(pos,datei->Strings[i].SubString(pos,datei->Strings[i].Length()-pos).Pos(",")-1); } } } else { ShowMessage("Datei nicht vorhanden"); }
Liebe Grüße und eine schönes Wochenende
Tobias
-
wenn du immer nur die 2. Zeile der Datei willst kannst du dir die for-Schleife auch sparen
außerdem liefert dir i==2 nicht die 2. sondern die 3. Zeile, da der Zähler ja bei 0 losgeht
und wenn du immer jede 2. Zeile willst, muß die Abfrage in Zeile 10 geändert werden:
if (i%2 > 0) //Stichwort: Modulo
-
Hallo,
ich möchte behaupten, dass dieses Thema nichts mit VCL oder BCC zu tun hat. Hier kann einer einfach nicht programmieren. Ich möchte meinen, ein ganz anderes Forum könnte es geben, ihm zu lehren, wie es geht.
Gruß Rudi