mikrocontroller.net

Forum: PC Hard- und Software Datenreihe neu Sortieren


Autor: Amateur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich stehe vor einem Problem, welches ich bisher händisch bearbeite, 
allerdings geht mir langsam die Luft aus.

Folgende Situation:
Ich habe Datenreihen in folgender Formatierung:
{ 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00},

ich benötige diese Daten in folgender Reihenfolge:
{ 0x00, 0x3E, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x3E},

Die Daten werden also "in der Mitte gespiegelt", um dies nochmal zu 
verdeutlichen:
IST:
{ 1, 2, 3, 4, 5, 6, 7, 8},
SOLL:
{ 8, 7, 6, 5, 4, 3, 2, 1},

Bisher mache ich das mit Copy&Paste per Hand, allerdings kann ich mir 
vorstellen, dass es mit findigen Excell-Tricks o.ä. möglich sein müsste, 
dies zu automatisieren.

Die Daten liegen als .txt vor und joa...was soll ich noch sagen? Wenn 
ich etwas vergessen habe-> sorry, bitte bescheid sagen, welche Info 
fehlt.

Vielen Dank schonmal im Voraus für Anregungen/Tips und Hilfe!

Liebe Grüße aus der Hauptstadt!

Ps.: Es geht hierbei um weit über 100 Zeilen á 8 Werten welche getauscht 
werden müssen, ergibt also weit über 800x Copy + 800x Paste....es lohnt 
sich also über eine "Automatisierung" nachzudenken. Allerdings ist es 
eine einmalige "Sache", daher macht es keinen Sinn, sich eine Teure 
Software dafür Programmieren zu lassen...(vor allem weil Privatprojekt)

Autor: Christian M. (Firma: magnetmotor.ch) (chregu) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde mir ein kleines Programm mit AutoIt, XProfan o.ä. schreiben, 
das zeilenweise einliest und die Werte kehrt. Ist in einer halben Stunde 
gemacht, schneller als von Hand editiert.

Sind die Zeilen immer gleich lang/im gleichen Format?

Nein, ich mache es Dir nicht! :-))

Gruss Chregu

Autor: Amateur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Vielen Dank für den Tip, ich werde mal nach den Programmen googlen und 
schauen, ob ich mich damit zurecht komme.
Ohne Ansatz (zu möglicher Software) ist es mir bisher schwer gefallen, 
irgendwas zu googlen :D

Und ja, die Zeilen sind immer identisch lang/formatiert, allerdings gibt 
es kein "Muster" nach denen ich die kompletten Daten (richtig 
Formatiert) generieren könnte. Hier nochmal ein paar Zeilen der 
Leckerbissen als Beispiel.
  
    { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00},
    { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F},
    { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78},
    { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00},

Autor: Jemand (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Nicht schön, aber was soll’s:
| perl -pe 's/\{(.+),(.+),(.+),(.+),(.+),(.+),(.+),(.+)\}/\{$8,$7,$6,$5,$4,$3,$2,$1}/' 

Autor: Christian M. (Firma: magnetmotor.ch) (chregu) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hallo Amateur,

früher war jedem MS-Betriebssystem ein GW-BASIC/QBASIC/QuickBASIC dabei, 
um solche Probleme zu lösen. Aber das war vor der "Generation Instant" 
und "Generation App". Auf dem Amiga gab's "Amiga-BASIC", aber von MS, 
merkte man.

Hier ein Beispiel wo ich ein ähnliches Problem mit XProfan löse:
Declare zeile%,byte%,text$,zeile$,zaehler%

Assign #1,"templog2008_hex.txt"
FileMode 0
Reset #1
If %IOResult
  Print "Datei kann nicht geöffnet werden."
Else
    Assign #2,"templog_hex2bin.bin"
    FileMode 1
    OpenRW #2
    
  WhileNot @EOF(#1)
    Input #1,zeile$
    IfNot @Equ(@Len(zeile$),0)
    Print zeile$
      Let zaehler% = 0
      WhileNot @Equ(zaehler%,9)
        Inc zaehler%
        text$ = @SubStr$(zeile$,zaehler%," ")
        text$ = "$",text$
        byte% = @Val(text$)
        PutByte #2,byte%
      EndWhile
    Else
      Print "Doch noch eine leere Zeile"
    EndIf
  EndWhile
  CloseRW #2
  Close #1
  Print "Fertig"
  WaitInput
EndIf
End

XProfan braucht ca. 10MB, AutoIt läuft ohne Installation.

Gruss Chregu

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der "Mitte" gespiegelt = Daten umgedreht, ...

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann man sogar mit der Kommandozeile machen...

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Amateur schrieb:
> Ps.: Es geht hierbei um weit über 100 Zeilen á 8 Werten welche getauscht
> werden müssen, ergibt also weit über 800x Copy + 800x Paste

Mit einem Editor, der beliebige rechteckige Bereiche kopieren kann (das
kann heute jeder, denn Notepad ist kein richtiger Editor), reduziert
sich das auf 8 × Copy + 8 × Paste.

Amateur schrieb:
>     { 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00},
>     { 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F},
>     { 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78},
>     { 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00},

Das sieht aus wie die Zeichenmuster für o, p, q und r, die von einem
C[++]-Programm auf ein Grafikdisplay geschrieben werden sollen. Wieso
änderst du nicht einfach dieses C[++]-Programm, indem du die
entsprechende Schleife abwärts statt aufwärts laufen lässt bzw. die
Arrayindizes <i> an den entsprechenden Stellen durch 7-<i> ersetzt?

: Bearbeitet durch Moderator
Autor: Dr. Sommer (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Weil mir gerade langweilig ist, hier die kompliziertest-mögliche Lösung 
in C++ mit Boost.Spirit. Ist dafür aber auch die effizienteste ;-)

Im Anhang als Kompilate für diverse Plattformen. Keinerlei 
Installation/Runtime nötig.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Ist dafür aber auch die effizienteste

Nicht ganz ;-)

Das Kopieren von numbers in swapped und den Aufruf von reverse hättest
du dir sparen können, wenn du in der darauffolgenden Schleife einfach
die Elemente von numbers von hinten nach vorn durchgegangen wärst.

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Yalu X. schrieb:
> Das Kopieren von numbers in swapped und den Aufruf von reverse hättest
> du dir sparen können,
Uhps, manchmal sieht man die einfachsten Sachen nicht. Aber Hauptsache 
einen Standard-Algorithmus (std::reverse) genutzt ;-) Man könnte den 
Output noch puffern um die Effizienz weiter zu erhöhen, oder Boost.Karma 
nutzen... Aber SO langweilig war mir dann doch nicht :)

Autor: Amateur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soooooo, nachdem mich meine bessere Hälfte etwas in beschlag genommen 
hat, melde ich mich nun mal wieder zu Wort!

Zuerst einmal: Vielen Dank an alle Beteiligten! Eure Lösungen und 
Vorschläge waren allesamt klasse.

Ich arbeite mich mal durch:

@ jemand: Vielen Dank für den gut gemeinten Script-Vorschlag, habe ich 
zwar nicht benutzt, allerdings weiß ich deine Mühe zu schätzen.

@Christian Müller: Danke auch, für dein Programmbeispiel, wenn hier 
keine komfortableren Lösungen gepostet worden wären, hätte ich sicher 
deine (pädagogisch vlt. sinnvollste) Lösung genutzt.

@STK500: Wenn du noch verraten hättest wie genau, dann würde ich mich 
auch bei dir für den Tipp bedanken. Jetzt kriegst du nur ein Dankeschön, 
weil du mit deinem Post dafür gesorgt hast, dass mein "Problem" weiter 
oben im Forum erscheint und vielleicht nur dadurch von yalu & co gelesen 
wurde ;)

@Yalu: Vielen Dank für den Tip mit dem blockweisen markieren. Ich 
arbeite zwar gelegentlich mit Notepad++, allerdings kannte ich diese 
Funktion nicht. Diese Variante habe ich letztendlich genutzt, das 
Problem ist gelöst und ich bin glücklich :)
Nebenbei: Respekt für dein scharfes HEX->Binär-Auge, du hast es richtig 
gesehen :D . An dem Programm selber wollte ich einfach nicht so viel 
rumschrauben, weil ich eigentlich ein reiner Hardwarefetischist bin. Ich 
verdrahte lieber 7 Schieberegister, 50 JK-FF und 42 Multiplexer, als das 
ich mich in einen Code einarbeite den ich am Ende total zerschieße und 
dann doch hier posten muss :D  Alles was über Assembler hinaus geht, mag 
ich einfach nicht :D

@Dr. Sommer: Danke, dass du dir die Mühe gemacht hast, ein 
entsprechendes Programm zu schreiben. Das nenne ich mal engagiert! Auch 
wenn ich eine andere Lösung verwendet habe, konnte ich nicht 
wiederstehen und habe dein Programm testen wollen. Allerdings öffnet 
sich nur kurz ein Konsolenfenster und verschwindet dann wieder. Sind für 
die .exe noch bestimmte Voraussetzungen nötig (Textfile in gleichem 
Ordner, etc. , pp.)?
Ich weiß, ich weiß: ganz schön leichtsinnig, eine .exe eines fremden zu 
öffnen, allerdings glaube ich nicht, dass sich ein böser Hacker die Mühe 
macht, hier seine Opfer zu finden. Außerdem benutze ich diesen PC eh nur 
als "Datenblattsuchmaschiene" in meiner Bastel-Kammer :D


Lange Rede kurzer Sinn: Vielen Dank nochmal an alle, die mitgewirkt 
haben!

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Amateur schrieb:
> Allerdings öffnet
> sich nur kurz ein Konsolenfenster und verschwindet dann wieder
Ja das ist ein Konsolenprogramm und hat kein richtiges Fenster. Du musst 
das aus einem cmd.exe Fenster aus aufrufen (vorher in den Ordner 
wechseln in den du es entpackt hast) und den Namen der 
Eingabe&Ausgabe-Dateien übergeben, ala:
sort-win64.exe eingabe.txt ausgabe.txt

Amateur schrieb:
> Ich weiß, ich weiß: ganz schön leichtsinnig,
Hihi... Daher ist der Quellcode ja mitgeliefert, kannst du ja selber 
kompilieren :)

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Amateur schrieb:
> @STK500: Wenn du noch verraten hättest wie genau, dann würde ich mich
> auch bei dir für den Tipp bedanken. Jetzt kriegst du nur ein Dankeschön,
> weil du mit deinem Post dafür gesorgt hast, dass mein "Problem" weiter
> oben im Forum erscheint und vielleicht nur dadurch von yalu & co gelesen
> wurde ;)

Dann hätte ich ja die komplette Lösung hinschreiben müssen. ;)
Aber eigentlich ganz einfach:
zwei verschachtelte for-Schleifen.
Die erste liest die Datei zeilenweise ein, die zweite liest die 8 Werte 
ein und gibt sie in umgekehrter Reihenfolge wieder aus (Die geschweiften 
Klammern kann man per Editor ändern).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.