textdatei lesen,bearbeiten und wieder in neue textdatei schreiben



  • 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


Anmelden zum Antworten