Thomas7: Ultraedit, suche regulären Ausdruck, meiner reicht nicht!

Hallo,

ich habe folgendes "CSV"-file mit Tab als Delimiter:
14.08.2006 08:00:00 116.19 1
14.08.2006 08:00:00 116.19 1
14.08.2006 08:00:00 116.19 1
14.08.2006 08:00:00 116.19 -1
14.08.2006 08:00:01 116.19 1
14.08.2006 08:00:01 116.20 1
14.08.2006 08:00:01 116.19 1
14.08.2006 08:00:01 116.20 -1
14.08.2006 08:00:02 116.20 1
14.08.2006 08:00:02 116.20 1
14.08.2006 08:00:02 116.20 1
14.08.2006 08:00:02 116.20 -1

Nun will ich alle Sekunde aber nur eine Zeile behalten und nicht vier, wie oben zu sehen.
Die Zeile mit -1 an Schluß habe ich durch folgenden Ausdruck %??????2006^t??:??:??^t???.??^t-1^p
wegbekommen, dann sieht es so aus:
14.08.2006 08:00:00 116.19 1
14.08.2006 08:00:00 116.19 1
14.08.2006 08:00:00 116.19 1
14.08.2006 08:00:01 116.19 1
14.08.2006 08:00:01 116.20 1
14.08.2006 08:00:01 116.19 1
14.08.2006 08:00:02 116.20 1
14.08.2006 08:00:02 116.20 1
14.08.2006 08:00:02 116.20 1

Aber wie ich nun die weiteren zwei Zeilen für jede Sekunde wegbekomme, so dass ich nachher nur
noch jeweils eine Zeile für jede Sekunde habe, krieg ich nicht raus. Es ist egal welche zwei
Zeilen der drei vorhandenen ersetzt werden.
Kann jemand nachhelfen?

Danke

PS:
Reguläre Ausdrücke (UltraEdit-Syntax):
Symbol Funktion
% Steht für den Zeilenanfang – Zeigt an, dass sich der Suchtext am Zeilenanfang befinden muss, aber keine der Zeilen abschließenden Zeichen in der resultierenden markierten Textstelle enthalten sind.
$ Steht für das Zeilenende – Zeigt an, dass sich der Suchtext am Zeilenende befinden muss, aber keine der Zeilen abschließenden Zeichen in der resultierenden markierten Textstelle enthalten sind.
? Steht für ein beliebiges Zeichen außer Zeilen-/Absatzwechsel.
* Steht für das beliebig häufige Auftreten eines beliebigen Zeichens außer Zeilenwechsel.

  • Steht für das ein- oder mehrmalige Auftreten des vorstehenden Zeichens/Ausdrucks. Das Zeichen/der Ausdruck muss mindestens einmal gefunden werden. Für wiederholte Zeilenwechsel ist dieses Symbol nicht geeignet.
    ++ Steht für das beliebig häufige – also auch das keinmalige – Auftreten des vorstehenden Zeichens/Ausdrucks. Für wiederholte Zeilenwechsel ist dieses Symbol nicht geeignet.
    ^b Steht für einen Seitenwechsel.
    ^p Steht für einen Zeilenwechsel/Absatz (CR/LF) in DOS-Dateien.
    ^r Steht für einen Zeilenwechsel/Absatz (nur CR) in MAC-Dateien.
    ^n Steht für einen Zeilenwechsel/Absatz (nur LF) in UNIX-Dateien.
    ^t Steht für ein Tabulator-Zeichen.
    [ ] Steht für ein beliebiges einzelnes Zeichen oder einen Zeichenbereich in den Klammern.
    ^{A^}^{B^} Steht für den Ausdruck A ODER B.
    ^ Übergeht das nachfolgende Zeichen eines regulären Ausdrucks.
    ^(…^) Klammert einen im "Ersetzen"-Befehl zu verwendenden Ausdruck. Ein regulärer Ausdruck kann sich aus bis zu 9 geklammerten Ausdrücken zusammensetzen, die gemäß der Reihenfolge ihres Auftretens im regulären Ausdruck durchnummeriert sind.Der entsprechende Ersetzungsausdruck lautet ^x, wobei x eine Zahl von 1 bis 9 ist. Wenn beispielsweise mit ^(H*o^) ^(L*e^) "Hallo Leute" gefunden wird, würde ^2 ^1 diesen Text durch "Leute Hallo" ersetzen.
    Hinweis: ^ bezieht sich auf das Zeichen '^' und NICHT auf die Taste Strg+Wert.
  1. gudn tach!

    Nun will ich alle Sekunde aber nur eine Zeile behalten und nicht vier, wie oben zu sehen.

    hast du vim, perl oder php zur verfuegung und kannst damit ein wenig umgehen?

    in perl koenntest du das komplette file in einen string laden und einen regexp (z.b. mit hilfe des m-modifiers) darauf anwenden.

    noch besser ist es - vor allem bei grossen csv-files -, das source-file zeilenweise einzulesen, jede zeile mit der vorigen zu vergleichen und bei ungleichheit in ein neues file zu schreiben.

    prost
    seth

  2. Hi !

    Sollte das OS Unix/Linux sein:

    tail my_datei.csv | grep -v "-1$" | tail -1

    Gruß

    Hans

    1. gudn tach!

      Sollte das OS Unix/Linux sein:

      es geht auch unter windows, mit den gnu-utils (http://unxutils.sourceforge.net/ oder cygwin).

      tail my_datei.csv

      listet die letzten 10 zeilen auf.

      | grep -v "-1$"

      (bzw. grep -v -e "-1$")
      gibt nur die zeilen ohne "-1" am ende aus.

      | tail -1

      gibt nur die letzte zeile aus.

      hmm, Hans oder ich hat bzw. habe das problem nicht verstanden...

      prost
      seth

      1. Hi seth,

        gibt nur die letzte zeile aus.

        also, ich habe es so verstanden, daß er jede Sekunde die letzte nicht "-1" Zeile habe will. So gesehen müßte es sogar

        tail -f datei.csv | grep -v -e "-1$" | tail -1

        sein.

        Gruß

        Hans

        1. gudn tach!

          gibt nur die letzte zeile aus.

          also, ich habe es so verstanden, daß er jede Sekunde die letzte nicht "-1" Zeile habe will.

          ich habe verstanden, als wolle er

          aus einer csv-datei a la

          14.08.2006 08:00:00 116.19 1
          14.08.2006 08:00:00 116.19 1
          14.08.2006 08:00:00 116.19 1
          14.08.2006 08:00:00 116.19 -1
          14.08.2006 08:00:01 116.19 1
          14.08.2006 08:00:01 116.20 1
          14.08.2006 08:00:01 116.19 1
          14.08.2006 08:00:01 116.20 -1
          14.08.2006 08:00:02 116.20 1
          14.08.2006 08:00:02 116.20 1
          14.08.2006 08:00:02 116.20 1
          14.08.2006 08:00:02 116.20 -1

          z.b. die folgenden zeilen erhalten:

          14.08.2006 08:00:00 116.19 1
          14.08.2006 08:00:01 116.19 1
          14.08.2006 08:00:02 116.20 1.

          deswegen wuerde

          tail -f datei.csv | grep -v -e "-1$" | tail -1

          nichts bringen, da nur eine zeile ausgegeben wuerde, egal wie viele unterschiedliche zeilen datei.csv enthaelt.

          prost
          seth

          1. Hi !

            14.08.2006 08:00:00 116.19 1
            14.08.2006 08:00:01 116.19 1
            14.08.2006 08:00:02 116.20 1.

            deswegen wuerde

            tail -f datei.csv | grep -v -e "-1$" | tail -1

            nichts bringen, da nur eine zeile ausgegeben wuerde, egal wie viele unterschiedliche zeilen datei.csv enthaelt.

            Richtig, dann bräuchte er

            tail -30 datei.csv | grep -v -e "-1$" | tail -3

            Die "-30" nur als Wert, um den Fall zu umgehen, dass bei den default mäßigen letzten 10 soviele "-1" Zeilen drin sind, daß es nicht genug "1" Zeilen für's Ergebnis gibt.

            Gruß

            Hans

            1. gudn tach!

              14.08.2006 08:00:00 116.19 1
              14.08.2006 08:00:01 116.19 1
              14.08.2006 08:00:02 116.20 1.

              deswegen wuerde

              tail -f datei.csv | grep -v -e "-1$" | tail -1

              nichts bringen, da nur eine zeile ausgegeben wuerde, egal wie viele unterschiedliche zeilen datei.csv enthaelt.

              Richtig, dann bräuchte er

              tail -30 datei.csv | grep -v -e "-1$" | tail -3

              aeh, nee, dann wuerde als ergebnis wohl

              14.08.2006 08:00:02 116.20 1
              14.08.2006 08:00:02 116.20 1
              14.08.2006 08:00:02 116.20 1
                                ^ (beachte den unterschied in dieser spalte)

              ausgegeben werden, weil die "doppelten" zeilen noch nicht rausfliegen.

              prost
              seth

              1. Hi !

                aeh, nee, dann wuerde als ergebnis wohl

                14.08.2006 08:00:02 116.20 1
                14.08.2006 08:00:02 116.20 1
                14.08.2006 08:00:02 116.20 1
                                  ^ (beachte den unterschied in dieser spalte)

                ausgegeben werden, weil die "doppelten" zeilen noch nicht rausfliegen.

                Immer diese Erbsenzähler...

                tail -30 datei | grep -v -e "-1$" | sort -u | tail -3

                Besser ? ;-)

                Gruß

                Hans

                1. gudn tach Hans!

                  Immer diese Erbsenzähler...

                  tail -30 datei | grep -v -e "-1$" | sort -u | tail -3

                  Besser ? ;-)

                  hehe, das klappt aber nur in faellen von maximal 12 erbsen aeh zeilen. da war Bernds vorschlag doch noch etwas flexibler (obgleich noch nicht genug flexibel).

                  prost
                  seth

                  1. Hi Seth,

                    Immer diese Erbsenzähler...

                    tail -30 datei | grep -v -e "-1$" | sort -u | tail -3

                    Besser ? ;-)

                    hehe, das klappt aber nur in faellen von maximal 12 erbsen aeh zeilen. da war Bernds vorschlag doch noch etwas flexibler (obgleich noch nicht genug flexibel).

                    Also, wenn ich 1 "-1" Zeile habe und 29 "gute" Zeilen, erhalte ich maximal 3 Zeilen als output, die jeweils um 1 Sekunde verschieden sind, da alle, die in der gleichen Sekunde erzeugt wurden, rausfallen.

                    Je mehr "böse" Zeilen und Zeilen mit gleicher Uhrzeit vorkommen, desto schwieriger wird es, die letzten 3 Zeilen unterschiedlicher Uhrzeit ohne "-1" zu bekommen.

                    Bernd's Vorschlag gibt nur die Zeilen ohne "-1" aus, ohne eine Eingrenzung auf die Anzahl der Zeilen zu machen.

                    Da, soweit ich mich erinnern kann, eine Einschränkung von 3 Zeilen gefragt war, ist meine Lösung diejenige, die der gewünschten Aufgabe am nächsten kommt.

                    Gruß

                    Hans

                    1. gudn tach!

                      hehe, das klappt aber nur in faellen von maximal 12 erbsen aeh zeilen. da war Bernds vorschlag doch noch etwas flexibler (obgleich noch nicht genug flexibel).

                      Also, wenn ich 1 "-1" Zeile habe und 29 "gute" Zeilen, erhalte ich maximal 3 Zeilen als output,

                      ja, wegen tail -3

                      die jeweils um 1 Sekunde verschieden sind, da alle, die in der gleichen Sekunde erzeugt wurden, rausfallen.

                      nein, siehe meine antwort auf Bernds posting.

                      Bernd's Vorschlag gibt nur die Zeilen ohne "-1" aus, ohne eine Eingrenzung auf die Anzahl der Zeilen zu machen.

                      ja, es werden alle "-1"-zeilen und alle doppelten rausgeschmissen, was den anforderungen des OP entspricht, bis auf die verlinkte ausnahme.

                      Da, soweit ich mich erinnern kann, eine Einschränkung von 3 Zeilen gefragt war, ist meine Lösung diejenige, die der gewünschten Aufgabe am nächsten kommt.

                      nein, diese einschraenkung wurde nie erwaehnt. dass bei dem beispiel mit den 12 zeilen am schluss bloss 3 zeilen rauskommen, war mehr oder weniger zufall.

                      prost
                      seth

                      1. Hallo seth & Hans,

                        ihr kriegt euch doch nicht etwa "in die Wolle"?

                        Mal abgesehen von den umfangreicheren "suchen & ersetzen" Methoden, hab  ich noch was ganz einfaches entdeckt:

                        %??????2006^t??:??:??^t???.??^t1^p

                        Ergebnis:
                        14.08.2006 15:07:33 116.13 -1
                        14.08.2006 15:07:34 116.13 -1
                        14.08.2006 15:07:35 116.13 -1
                        14.08.2006 15:07:36 116.13 -1
                        14.08.2006 15:07:37 116.13 -1

                        voilà :-))
                        Ich wollte für jede Sekunde eine Zeile, ich hab nie gesagt, dass ich die Zeilen mit -1 nicht haben will. Ich hab lediglich im ersten Posting das "Pferd" von hinten aufgezäumt, indem ich alle Zeilen mit -1 "gelöscht" habe... anstatt sie zu behalten. Ja, manchmal sieht man den Wald vor lauter Bäumen nicht! Ohne euch wäre ich wohl nicht draufgekommen...

                        Dieses Vim würd ich gerne mal ausprobieren, welche Version muß ich da am besten nehemen für Windows?:
                        http://www.vim.org/download.php#pc

                        Besten Dank!

                        1. Hallo,

                          etwas zu früh gefreut.

                          ich habe drei verschiedene files

                          -----------------1. file------------------
                          14.08.2006 08:00:00 116.19
                          14.08.2006 08:00:01 116.20
                          ...
                          14.08.2006 21:59:59 116.02
                          14.08.2006 22:00:00 116.02

                          -----------------2. file------------------
                          14.08.2006 08:00:00 109.46
                          14.08.2006 08:00:01 109.46
                          ...
                          14.08.2006 21:59:59 109.32
                          14.08.2006 22:00:00 109.32

                          -----------------3. file------------------
                          14.08.2006 08:00:00 104.00
                          14.08.2006 08:00:01 104.00
                          ...
                          14.08.2006 21:59:59 103.93
                          14.08.2006 22:00:00 103.93 -1

                          Alle sollte doch jedes file 46800 Zeilen habe, oder?
                          (8h-22h = 13 Stunden) 13*60*60 = 46800 (Sekunden/Zeilen)

                          Nun hat aber:
                          1. file
                          45901 Zeilen

                          2. file
                          46201 Zeilen

                          3. file
                          50402 Zeilen

                          Kann man mit vim die files vergleichen zu welchen Zeiten Unstimmigkeiten herrschen?

                          1. Hi Thomas7,

                            Alle sollte doch jedes file 46800 Zeilen habe, oder?
                            (8h-22h = 13 Stunden) 13*60*60 = 46800 (Sekunden/Zeilen)

                            Komisch, 8h-22h sind bei mir 14 Stunden.

                            Kann man mit vim die files vergleichen zu welchen Zeiten Unstimmigkeiten herrschen?

                            Ultraedit kann das auch.
                            Menue File->Compare Files

                            Gruß Lukas.

                            1. Hi Lukas,

                              Alle sollte doch jedes file 46800 Zeilen habe, oder?
                              (8h-22h = 13 Stunden) 13*60*60 = 46800 (Sekunden/Zeilen)

                              Komisch, 8h-22h sind bei mir 14 Stunden.

                              8:00:00 bis 22:00:00, stimmt! Dann sinds 54000 (Sekunden/Zeilen)!!!

                              Ultraedit kann das auch.
                              Menue File->Compare Files

                              Die Funktion kenne ich, aber ich will folgendes:
                              -----------1. file-------- -----------2 file--------- -----------3. file--------
                              14.08.2006 08:00:00 116.19 14.08.2006 08:00:00 109.46 14.08.2006 08:00:00 104.00
                                                  ^^^^^^                     ^^^^^^                     ^^^^^^ Unstimmig
                              14.08.2006 08:00:01 116.20 14.08.2006 08:00:01 109.46 14.08.2006 08:00:01 104.00
                                                  ^^^^^^                     ^^^^^^                     ^^^^^^ Unstimmig
                              Wenn ich diese drei files vergleiche - ich will, dass jedes file die gleichen Zeiten/Datumswerte
                              hat - dann zeigt mir Ultraedit mit Compare Files Unstimmigkeit an, weil unterscheidliche Zahlen
                              hinter den Uhrzeiten stehen.

                              Ich hab das Problem schon so umgangen, dass ich die files in Excel "kopiert" habe und dann die
                              letzte Spalte gelöscht,  nur die Spalten mit Datum Uhrzeit gespeichert und dann mit Ultraedit / Compare Files
                              verglichen habe. Ziemlich umständlich, da man die Spalten aus Excel jauach wieder in extra files speichern muß etc.

                              MfG

                              1. prost
                                seth

                                "Damit" hab ich manchmal "Vorstellungsschwierigkeiten" ;-)
                                https://forum.selfhtml.org/?t=134747&m=874994

                                14*60*60+_1_ = 50401

                                Dann ist mein drittes file mit 50402 Zeilen gar nicht mal so schlecht! :-)

                                MfG

                              2. gudn tach!

                                Ich hab das Problem schon so umgangen, dass ich die files in Excel "kopiert" habe und dann die
                                letzte Spalte gelöscht,  nur die Spalten mit Datum Uhrzeit gespeichert und dann mit Ultraedit / Compare Files
                                verglichen habe. Ziemlich umständlich, da man die Spalten aus Excel jauach wieder in extra files speichern muß etc.

                                es bleibt wohl eine offene frage, ob sowas (excel-hin-und-her-kopiererei) oder :%s/^([^\t]+\t[^\t]+).*/\1/ (vim bzw. regulaere ausdruecke) umstaendlicher ist. ;-)
                                die leute, die beides kennen, moegen afaik allerdings eher regulaere ausdruecke.

                                hast du etwa vim schon wieder aufgegeben?

                                prost
                                seth

                                1. Hi,

                                  hast du etwa vim schon wieder aufgegeben?

                                  Nein, runtergeladen, aber alles braucht seine Zeit... ;-)

                                  MfG

                                  PS: werde wohl _dann_ wahrscheinlich einen neuen Thread eröffnen müßen... vielleicht erst nächste Woche...

                                  1. gudn tach!

                                    hast du etwa vim schon wieder aufgegeben?

                                    Nein, runtergeladen, aber alles braucht seine Zeit... ;-)

                                    ja, und vim sowieso. man braucht mehrere tage geduld, um keine aggredssionen gegen ihn aufzubauen.

                                    PS: werde wohl _dann_ wahrscheinlich einen neuen Thread eröffnen müßen... vielleicht erst nächste Woche...

                                    ui, vorsicht. wenn dieser thread noch existieren sollte, klatsch es ruhig hier rein, denn sonst laeufst du gefahr, dass dich manche leute hier verbal ankacken. wenn du in diesem thread bleibst, macht das nix, sondern hat sogar den vorteil, dass man spaeter mal nachvollziehen kann, warum du ueberhaupt vim benutzt.

                                    prost
                                    seth

                                    1. Hi Seth,
                                      ich wollte ja nur anmerken, dass UEdit auch einen Spaltenmodus hat (alt+c) und das Thomas7 wohl doch auf Perl zurückgreifen wird, da meine  Kleine mit JScript und dem Vergleichen von 3*45.000 Zeilern zu arg pustet.

                                      Aber egal, _nun_ sag ich einfach auch mal Prost.

                                      Gruß Lukas

                                      1. gudn tach!

                                        ich wollte ja nur anmerken, dass UEdit auch einen Spaltenmodus hat (alt+c)

                                        ja, ich erinnere mich. das ist eine sehr nuetzliche sache und wird von nur wenigen editoren beherrscht. (vim kann das selbstverstasendlich auch... CTRL-V, bzw. ":help block".

                                        und das Thomas7 wohl doch auf Perl zurückgreifen wird, da meine  Kleine mit JScript und dem Vergleichen von 3*45.000 Zeilern zu arg pustet.

                                        nach 10-maligem lesen dieses satzes vermute ich nun, folgendes daraus extrahieren zu koennen: deinem (weiblichen) computer ist der vergleich grosser dateien via jscript zu anstrengend.
                                        hmm, ok, die datei-groesse waere perl bei zeilenweisem auslesen und schreiben relativ egal.
                                        aber auch vim hat mit solchen dateien normalerweise keine probleme. zwei 50k-zeilen-dateien nach art der csv-files im OP werden (auch in diff-mode) bei mir (466MHz, ca. 256MB ram) nahezu genausoschnell geladen wie zwei kleine dateien und wenn sie mal geladen wurden, ist die groesse egal.

                                        Aber egal, _nun_ sag ich einfach auch mal Prost.

                                        prost
                                        seth

                                        1. Na,

                                          ich wollte ja nur anmerken, dass UEdit auch einen Spaltenmodus hat (alt+c)

                                          ja, ich erinnere mich. das ist eine sehr nuetzliche sache und wird von nur wenigen editoren beherrscht. (vim kann das selbstverstasendlich auch... CTRL-V, bzw. ":help block".

                                          UEdit Spaltenmodus (alt+c) ausprobiert, aber wie kann ich nun zB. die letzte Spalte markieren? manuell mit scrollen fellt flach, bei soviel Zeilen und wenn ich strg+shift+Ende nehme dann wird mir irgend ein Spaltenbereich markiert.

                                          Mit trial & error geht es nach 2 -3 Minuten, gibt es dazu nicht einen Trick?

                                          Naja, vielleicht doch gleich vim installieren!?

                                          Frage zu "vim":
                                          In file 1 fehlen zB. die Zeilen "komplett" für 10 Minuten, könnte ich diese mit vim einfach durch "suchen&ersetzen" auffüllen? Also mit Datum und entsprechender fortlaufender Uhrzeit?
                                          -----------------1. file------------------
                                          14.08.2006 20:26:39

                                          14.08.2006 21:36:40
                                                        ^^
                                          -----------------2. file------------------
                                          14.08.2006 20:26:39
                                          14.08.2006 20:26:40

                                          MfG

                                          1. gudn tach!

                                            UEdit Spaltenmodus (alt+c) ausprobiert, aber wie kann ich nun zB. die letzte Spalte markieren? manuell mit scrollen fellt flach, bei soviel Zeilen und wenn ich strg+shift+Ende nehme dann wird mir irgend ein Spaltenbereich markiert.

                                            was heisst "irgendein spaltenbereich"? kann man denn nicht bei gedrueckter shift-taste (nach ctrl+shift+end) mit den cursor-tasten den passenden bereich selektieren?

                                            Naja, vielleicht doch gleich vim installieren!?

                                            ja

                                            Frage zu "vim":
                                            In file 1 fehlen zB. die Zeilen "komplett" für 10 Minuten, könnte ich diese mit vim einfach durch "suchen&ersetzen" auffüllen? Also mit Datum und entsprechender fortlaufender Uhrzeit?

                                            die antwort lautet natuerlich "ja, selbstverstaendlich geht das!".

                                            wenn du die beiden files

                                            -----------------1. file------------------
                                            14.08.2006 20:26:39

                                            14.08.2006 21:36:40
                                                          ^^
                                            -----------------2. file------------------
                                            14.08.2006 20:26:39
                                            14.08.2006 20:26:40

                                            ...
                                            14.08.2006 21:26:40
                                            hast, kannst du ja einfach den abschnitt aus dem 2. file rueber ins erste kopieren (das sind uebrigens nicht nur 10 sondern sogar ungefaehr 70 minuten).
                                            oder verstehe ich die aufgabenstellung falsch?

                                            zunaechst setzt man den cursor an den beginn der zu kopierenden stelle. mit "v" geht man dann in den markier-modus (aehnlich wie in ultraedit mit gedrueckter shift-taste). anschliessend sucht man via "/21:26:40<enter>" die zielzeile und markiert gleichzeitig alles bis dorthin. mit "y" speichert man den kram im standardregister (in ultraedit waere das einfach der cache) und im anderen file kann man an der entsprechenden stelle den kram mit "p" wieder einfuegen.

                                            prost
                                            seth

                          2. gudn tach!

                            14.08.2006 08:00:00 104.00
                            14.08.2006 08:00:01 104.00
                            ...
                            14.08.2006 21:59:59 103.93
                            14.08.2006 22:00:00 103.93 -1

                            Alle sollte doch jedes file 46800 Zeilen habe, oder?
                            (8h-22h = 13 Stunden) 13*60*60 = 46800 (Sekunden/Zeilen)

                            46801, ja.

                            Kann man mit vim die files vergleichen zu welchen Zeiten Unstimmigkeiten herrschen?

                            kurze antwort: ja, vim kann alles, wenn's um's dateien-editieren geht.

                            um zwei dateien zu vergleichen kann man den parameter "-d" verwenden:
                            vim -d file1 file2

                            problem ist allerdings, dass sich die zeilen ja (fast) alle in der dritten spalte unterscheiden.
                            deswegen koenntest du in einem ersten schritt kopien anlegen, denen die dritte spalte fehlt.
                            die dritte spalte loeschen kann man in vim mit

                            :%s/^([^\t]+\t[^\t]+).*/\1/

                            stichwort: regulaere ausdruecke in vim

                            wenn du aber eh vim benutzen moechtest, kannst du auch gleich damit in den urspruenglichen dateien die "doppelten" zeilen loeschen.

                            :%s/(14.08.2006\t[^\t]+)(\t.*\n)(\1\t.*\n)*/\1\2/g

                            kurze erklaerung:
                            command-line-mode
                            % komplettes file
                            s suche und ersetze. s/a/b/g heisst "ersetze a durch b ueberall" (g=global)

                            such-ausdruck:
                            (14.08.2006\t[^\t]+)(\t.*\n)(\1\t.*\n)*

                            (14.08.2006\t[^\t]+) matcht die ersten beiden spalten und speichert sie in \1
                            (\t.*\n) matcht den rest der zeile und speichert ihn in \2
                            (\1\t.*\n)* matcht folgende zeilen deren erste beiden spalten identisch zur aktuellen zeile sind.
                            (je nach datei-format musst du noch das zeilenende \n durch \r\n oder \n\r ersetzen.)

                            ersetz-ausdruck:
                            \1\2

                            prost
                            seth

                            1. gudn tach!

                              Alle sollte doch jedes file 46800 Zeilen habe, oder?
                              (8h-22h = 13 Stunden) 13*60*60 = 46800 (Sekunden/Zeilen)

                              46801, ja.

                              aeh, wie Lukas richtig sagte, _14_*60*60+1 = 50401

                              (wird deutlich, wenn man nur 08:00:00 bis 09:00:00 betrachtet (1*60*60+1).)

                              prost
                              seth

                        2. gudn tach!

                          ihr kriegt euch doch nicht etwa "in die Wolle"?

                          nee, nee. es waren/sind bloss ein paar missverstaendnisse zu beseitigen.

                          Mal abgesehen von den umfangreicheren "suchen & ersetzen" Methoden, hab  ich noch was ganz einfaches entdeckt [...]
                          Ich wollte für jede Sekunde eine Zeile, ich hab nie gesagt, dass ich die Zeilen mit -1 nicht haben will.

                          ach so, ok. ich nahm (wohl faelschlich) an, dass diese "-1"-zeilen uninteressant seien.

                          Dieses Vim würd ich gerne mal ausprobieren, welche Version muß ich da am besten nehemen für Windows?:
                          http://www.vim.org/download.php#pc

                          ich benutze und empfehle:
                          ftp://ftp.vim.org/pub/vim/pc/vim70rt.zip
                          und
                          ftp://ftp.vim.org/pub/vim/pc/vim70w32.zip

                          wenn du dagegen auf ein richtiges graphisches interface nicht verzichten kannst: ftp://ftp.vim.org/pub/vim/pc/gvim70.exe

                          mit "vimtutor" bekommt man eine kleine einfuehrung vorgesetzt.
                          am anfang wichtig: ":q" (ohne anf.-zeichen) heisst "schliessen" und ":q!" heisst "schliessen und aenderungen verwerfen".

                          prost
                          seth

  3. Hallo,

    unter Unix könnte dies helfen

    grep -v -e "-1$" <Eingabedatei> | sort -u

    Gruss

    Bernd

    1. gudn tach!

      unter Unix könnte dies helfen

      und fuer windows gibt's entsprechende ports: z.b. http://unxutils.sourceforge.net/ oder cygwin.

      grep -v -e "-1$" <Eingabedatei> | sort -u

      nur fast, denn
        14.08.2006 08:00:01 116.20 1
        14.08.2006 08:00:01 116.19 1
      sind zwei verschiedene zeilen. dennoch sollte aber laut OP nur eine davon erhalten bleiben.

      ich bin immer noch fuer perl (oder vim, ...).
      falls pro sekunde wirklich immer genau 4 datensaetze im csv-file stehen, ist die methode, die Bernd nannte, wohl am einfachsten zu realisieren.

      prost
      seth

      1. gudn tach!

        falls pro sekunde wirklich immer genau 4 datensaetze im csv-file stehen, ist die methode, die Bernd nannte, wohl am einfachsten zu realisieren.

        oops, s/Bernd/Lukas/

        das meine ich.

        prost
        seth

  4. Hi,
    ein anderer Vorschlag:
    Zeichne ein Makro auf welches von den vier Zeilen einer Sekunde bsw. die letzten drei löscht und führe dieses Makro dann Zeilenanzahl der Datei durch 4 mal aus.
    Gruß
    Lukas

    1. Hi,

      Zeichne ein Makro auf welches von den vier Zeilen einer Sekunde bsw. die letzten drei löscht

      Dies verstehe ich nicht.

      und führe dieses Makro dann Zeilenanzahl der Datei durch 4 mal aus.

      Die files haben ca. 100 000 Zeilen, seit ihr jetzt nur von 12 Zeilen ausgegangen?
      Dann geht das mit dem Makro nicht, oder hab ich das falsch verstanden?

      Ich hatte heute keine Zeit mich damit zu befassen, aber kann man dann grob sagen,
      dass es mit Ultredit allein nicht geht und ich zu unix, PHP etc. greifen müßte?
      Ich benutz Windows und PHP wäre nicht unmöglich...

      Dieses UnxUtils hab ich mal geladen, soweit bin ich heute gekommen ;-)
      "Try `grep --help' for more information."

      Jetzt ist Nachtruhe, vielen Dank!

      1. gudn tach!

        Zeichne ein Makro auf welches von den vier Zeilen einer Sekunde bsw. die letzten drei löscht

        Dies verstehe ich nicht.

        in ultraedit kann man bestimmt bearbeitungs-vorgaenge als makro abspeichern und bei bedarf wieder abspielen.

        und führe dieses Makro dann Zeilenanzahl der Datei durch 4 mal aus.

        Die files haben ca. 100 000 Zeilen, seit ihr jetzt nur von 12 Zeilen ausgegangen?

        noe.

        Dann geht das mit dem Makro nicht, oder hab ich das falsch verstanden?

        evtl. kann man bei ultraedit sagen, dass ein makro n-mal ausgefuehrt werden soll. da ich jedoch kein ultraedit habe, sondern fast nur noch vim benutze, weiss ich das nicht.

        Ich hatte heute keine Zeit mich damit zu befassen, aber kann man dann grob sagen,
        dass es mit Ultredit allein nicht geht und ich zu unix, PHP etc. greifen müßte?
        Ich benutz Windows und PHP wäre nicht unmöglich...

        eine alternative waere der oben genannte editor vim. wenn tatsaechlich nur jede vierte zeile erhalten bleiben soll, geht das mit einem makro. in vim ginge das wie folgt:

        qqj3ddq25000@q:w<enter>

        fertig.

        erklaerung:
        q beginne makro-aufzeichnung
        q speichere das makro ins register "q"
        j gehe in die naechste zeile
        3dd loesche diese und die beiden folgenden zeilen
        q beende makro-aufzeichnung
        25000@q spiele das makro im register "q" 25000 mal ab.
        :w<enter> speichere ergebnis ("<enter>" steht fuer das druecken der enter-taste)

        vim ist allerdings gewoehnungsbeduerftig.

        Dieses UnxUtils hab ich mal geladen, soweit bin ich heute gekommen ;-)
        "Try `grep --help' for more information."

        wow, nicht schlecht. ;-)

        wenn wirklich nur jede vierte zeile erhalten bleiben soll, so ginge es evtl. auch mit zwei verschachtelten for-schleifen im cli und head aus den unxutils.

        for /l %i in (1,4,12) do @more +%i test.txt | \usr\local\wbin\head -n1 > ausgabe.txt

        12 muss noch durch die richtige anzahl der zeilen ersetzt werden.
        kannst du ermitteln mit
          find /c ":" test.txt

        wenn allerdings nicht immer genau vier zeilen pro sekunde existieren, kommst du wohl um eine etwas hoehere sprache nicht rumherum.
        wenn du perl oder php nicht instellieren/lernen moechtest, waere als windows-boardmittel noch der wsh (windows schripting host) zu nennen. kannst du ein wenig vbs?

        prost
        seth

        1. gudn tach!

          ich war eben in eile und habe deswegen nicht noch mal drueber geschaut, was ich da eigentlich geschrieben hatte.

          jetzt also noch ein paar praezisierungen/korrekturen.

          [vim]

          qqj3ddq25000@q:w<enter>

          fertig.

          erklaerung:
          q beginne makro-aufzeichnung
          q speichere das makro ins register "q"
          j gehe in die naechste zeile
          3dd loesche diese und die beiden folgenden zeilen
          q beende makro-aufzeichnung
          25000@q spiele das makro im register "q" 25000 mal ab.
          :w<enter> speichere ergebnis ("<enter>" steht fuer das druecken der enter-taste)

          das setzt voraus, dass die anzahl der zeilen der datei 100004 ist, weil durch das makro-aufzeichnen ja bereits die ersten vier zeilen abgehandelt wurden.

          for /l %i in (1,4,12) do @more +%i test.txt | \usr\local\wbin\head -n1 > ausgabe.txt

          in der bahn ist mir eingefallen, dass noch nicht ganz richtig ist.
          (for /l %i in (1,4,12) do @more +%i test.txt | \usr\local\wbin\head -n1) > ausgabe.txt

          sollte richtig sein.

          12 muss noch durch die richtige anzahl der zeilen ersetzt werden.
          kannst du ermitteln mit
            find /c ":" test.txt

          wenn's flexibel gestaltet werden soll, geht das z.b. folgendermassen:

          for /f "usebackq" %i in (find /c ":" test.txt ^| findstr ":" ^| sed -e "s/.\*: //") do set zeilenanzahl=%i
            (for /l %i in (1,4,%zeilenanzahl%) do @more +%i test.txt | \usr\local\wbin\head -n1) > ausgabe.txt

          oder gleich in einem rutsch:

          for /f "usebackq" %i in (find /c ":" test.txt ^| findstr ":" ^| sed -e "s/.\*: //") do @(for /l %j in (1,4,%i) do @more +%j test.txt | \usr\local\wbin\head -n1) > ausgabe.txt

          wobei u.u. der pfad zu head.exe (\usr\local\wbin\head) noch angepasst werden muss.
          dieses mal habe ich den code auch sicherheitshalber ausprobiert.

          prost
          seth