GELÖST Grep/Sed usw. - vergleich von Zahlen über zwei Zeilen

Diskutiere Grep/Sed usw. - vergleich von Zahlen über zwei Zeilen im Programmierung Forum im Bereich Software Forum; Hallo liebe Community, soeben bin ich dabei, bestimmte Informationen aus nem Haufen XML-Dateien herauszukitzeln. Zusammengegrept habe ich mir den...
D

Dobias

Threadstarter
Mitglied seit
26.01.2009
Beiträge
28
Hallo liebe Community,

soeben bin ich dabei, bestimmte Informationen aus nem Haufen XML-Dateien herauszukitzeln.
Zusammengegrept habe ich mir den Kram jetzt in eine Datei, die in diesem Format ist.
Code:
orders/Backup_BM01_289031025251.xml-                <value><int>1</int></value>
orders/Backup_BM01_289031025251.xml-                    <value><string>1</string></value>
orders/Backup_BM01_289031025251.xml-                <value><int>1</int></value>
orders/Backup_BM01_289031025251.xml-                    <value><string>1</string></value>
orders/Backup_BM01_289987046204.xml-                <value><int>40</int></value>
orders/Backup_BM01_289987046204.xml-                    <value><string>40</string></value>
orders/Backup_BM01_289987046204.xml-                <value><int>3</int></value>
orders/Backup_BM01_289987046204.xml-                    <value><string>2</string></value>
orders/Backup_BM01_289987046204.xml-                <value><int>5</int></value>
orders/Backup_BM01_289987046204.xml-                    <value><string>5</string></value>
orders/Backup_BM01_289987560157.xml-                    <value><string>10</string></value>
orders/Backup_BM01_289987560157.xml-                    <value><string>50</string></value>
orders/Backup_BM01_289987560157.xml-                    <value><string>30</string></value>
orders/Backup_BM01_289987560157.xml-                    <value><string>20</string></value>
orders/Backup_BM01_289987560157.xml-                    <value><string>10</string></value>
orders/Backup_BM01_290098287204.xml-                <value><int>1</int></value>
orders/Backup_BM01_290098287204.xml-                    <value><string>3</string></value>
orders/Backup_BM01_290098287204.xml-                <value><int>40</int></value>
orders/Backup_BM01_290098287204.xml-                    <value><string>40</string></value>
Die Datei ist ca 150k Zeilen lang, also manuelles Suchen scheidet aus. ;-)
Mich interessieren jetzt, wo es vorkommt, dass in einer Zeile N ein Int-Wert steht und in Zeile n+1 ein Stringwert, der von diesem Abweicht.
Stringwerte ohne Int-Werte in der vorherigen Zeile können auftreten.
Int-Werte ohne String-Wert in der nächsten Zeile gibt es nicht.
Im gegebenen Beispiel sind es also diese beiden Strings, die ich gerne als Ausgabe hätte.
Code:
Backup_BM01_289987046204
Backup_BM01_290098287204
Leider hab ich den entsprechenden regulären Ausdruck noch nicht zusammenfrickeln können.
Wär echt klasse, wenn mir jemand dabei helfen könnte. :-)

Vielen Dank im Voraus
Dobias
 
automatthias

automatthias

vernunftgeplagt
Mitglied seit
21.04.2006
Beiträge
8.161
Ich würde versuchen, das mithilfe eine perl-scripts zu machen. awk könnte auch gehen, aber perl ist da m.E. am besten geeignet.
Ich kann dir aber leider nicht "aus der Lameng" einen fertigen Skript bzw. Algorithmus liefern. Vermutlich musst Du zeilenweise einlesen, eine Zeile in einen Puffer schreiben, die nächste Zeile lesen und dann beide in geeigneter Weise vergleichen.
 
D

Dobias

Threadstarter
Mitglied seit
26.01.2009
Beiträge
28
Ok, ich hab befürchtet, dass das nich so einfach geht. Danke dir trotzdem. Da ich Perl und awk nur wenig kenne, werd ich eben cpp bemühen. ^_-

edit: so, fertig. Der Vollständigkeit halber und für andere Suchende hier mein Code zur Lösung:
Code:
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
	fstream filestr;
	filestr.open( "D:bla.txt", fstream::in );
	char line[256];
	std::string line1, line2;
	while( filestr.getline( line, 256 ) )
	{
		line1 = line2;
		line2 = line;
		string::size_type loci1 = line1.find( "<int>", 0 );
		string::size_type loci2 = line1.find( "</int>", 0 );
		string::size_type locs1 = line2.find( "<string>", 0 );
		string::size_type locs2 = line2.find( "</string>", 0 );
		if ( ( loci1 != string::npos ) && ( loci2 != string::npos ) && ( locs1 != string::npos ) && ( locs2 != string::npos ) )
		{
			string::size_type lociStart = loci1 + 5;
			string::size_type lociEnd = loci2 - 1;
			string::size_type locsStart = locs1 + 8;
			string::size_type locsEnd = locs2 - 1;
			string intValueString = line1.substr( lociStart, 1 + lociEnd - lociStart );
			string StringValueString = line2.substr( locsStart, 1 + locsEnd - locsStart );
			if ( intValueString != StringValueString )
			{
				string name = line1.substr( 0, line1.find( "-", 0 ) );
				cout << name << ";" << intValueString << ";" << StringValueString << endl;
			}
		}
	}
	filestr.close();
	return 0;
}
Angewendet auf Dateien mit anderem Format, kanns sicher auch knallen, aber für meinen Fall reichts.:pfeifen
 
Zuletzt bearbeitet:
automatthias

automatthias

vernunftgeplagt
Mitglied seit
21.04.2006
Beiträge
8.161
oder so :-)

Ich hatte halt gedacht, du wolltest eine reine Skriptlösung.
 
Thema:

Grep/Sed usw. - vergleich von Zahlen über zwei Zeilen

Grep/Sed usw. - vergleich von Zahlen über zwei Zeilen - Ähnliche Themen

  • Suche Online Speicher für pdf usw wo ich alles vom Handy aus lesen kann

    Suche Online Speicher für pdf usw wo ich alles vom Handy aus lesen kann: Hallo! Möchte einige Dokumente als Word und Excel und PDF online stellen um von überall da drauf zu greifen zu können um da zu lesen. Wie geht...
  • GELÖST UTF8-Dateien + SED (UnxUtils) + Umlaute = bä

    GELÖST UTF8-Dateien + SED (UnxUtils) + Umlaute = bä: Hallo liebe Community, ich möchte in meheren XML-Dateien, die im UFT8-Format (ohne Byte Order Mark) vorliegen, unter Windows XP SP2 bestimmte...
  • WIKI - SED-Display

    WIKI - SED-Display: Weiterlesen...
  • WIKI - SED-Display

    WIKI - SED-Display: Weiterlesen...
  • WIKI - SED-Display

    WIKI - SED-Display: Weiterlesen...
  • Ähnliche Themen

    Oben