textdatei lesen,bearbeiten und wieder in neue textdatei schreiben
-
Super das geht !!
for( int i = 0; i < Memo1->Lines->Count; i++ ) { if( Memo1->Lines->Strings[i].Pos("H200348000000000000002483") > 0 ) { Label1->Caption=i; } }
Ich öffne die Textdatei jetzt mit öffnen des Porgrammes. Jetzt würde ich gerne in der Zeile wo er den Tag gefunden hat noch nach den Einstellungen suchen und die Summe wie oft diese Bedingung vorgekommen ist ausgeben.
Kann ich einfach eine 2. Schleife nehmen und ab dem Wert der Variable i weiter zählen?Lieben Gruß
Tobias€dit: Wieso findet er den Tag so 327 mal und wenn ich z.B. <2 schreibe findet er ihn 1087 mal?
-
wenn du dem Label wirklich i zuweist wird nicht die Anzahl sondern immer die Position des letzten gefundenen Elements angezeigt...
int anzahl = 0; for( int i = 0; i < Memo1->Lines->Count; i++ ) { if( Memo1->Lines->Strings[ i].Pos("H200348000000000000002483") > 0 ) { anzahl++; Label1->Caption=anzahl; } }
schau dir mal die Methode Pos von AnsiString in der Hilfe an, dann weißt du was sie zurückgibt
bei ">0" ist die Bedingung immer dann wahr wenn der Suchtext irgendwo in der Zeile ist
bei "<2" ist die Bedingung nur dann wahr wenn der Suchtext an Position 1 der Zeile steht, d.h. wenn die Zeile mit dem Suchttext beginnt oder wenn der Text gar nicht enthalten ist, weil dann liefert Pos nämlich 0 zurück und das ist bekanntlich auch kleiner 2
-
Danke!
War allerdings nur ein TestUnd die Hilfe läuft unter Win7 leider nicht mehr... Wie lesen ich den jetzt in der Zeile "weiter"?
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,Ich stehe ja quasi an der stelle H2003480000000000000024B0 und ich will in dieser Zeile noch das Ende lesen und überprüfen. Also ob beispielsweise Vortest W0 AT_P7 und ATTRIB FS=27DB gegeben ist.
Meine Überlegung war sofor( int x = i; x < Memo1->Lines->Count; x++ ) { if( Memo1->Lines->Strings[x].Pos("ATTRIB FS=27DB") > 0 ) { //mache irgendwas } }
geht nur leider nicht.
-
du mußt ja nur prüfen ob in der gleichen Zeile auch der andere Text mit drin steht, dazu brauchst du aber keine 2. Schleife, sondern nur einen 2. Vergleich für die Zeile i
-
Das habe ich auch schon getestet
if( Memo1->Lines->Strings[ i].Pos("H200348000000000000002483") > 0 &&Memo1->Lines->Strings[ i].Pos("ATRRIB FS=30DB"))
geht nur leider nicht
-
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