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:
Die Daten werden also "in der Mitte gespiegelt", um dies nochmal zu
verdeutlichen:
IST:
1
{ 1, 2, 3, 4, 5, 6, 7, 8},
SOLL:
1
{ 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)
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
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.
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:
1
Declare zeile%,byte%,text$,zeile$,zaehler%
2
3
Assign #1,"templog2008_hex.txt"
4
FileMode 0
5
Reset #1
6
If %IOResult
7
Print "Datei kann nicht geöffnet werden."
8
Else
9
Assign #2,"templog_hex2bin.bin"
10
FileMode 1
11
OpenRW #2
12
13
WhileNot @EOF(#1)
14
Input #1,zeile$
15
IfNot @Equ(@Len(zeile$),0)
16
Print zeile$
17
Let zaehler% = 0
18
WhileNot @Equ(zaehler%,9)
19
Inc zaehler%
20
text$ = @SubStr$(zeile$,zaehler%," ")
21
text$ = "$",text$
22
byte% = @Val(text$)
23
PutByte #2,byte%
24
EndWhile
25
Else
26
Print "Doch noch eine leere Zeile"
27
EndIf
28
EndWhile
29
CloseRW #2
30
Close #1
31
Print "Fertig"
32
WaitInput
33
EndIf
34
End
XProfan braucht ca. 10MB, AutoIt läuft ohne Installation.
Gruss Chregu
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?
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.
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.
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 :)
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!
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 :)
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).