Forum: PC Hard- und Software Tabelle "beschneiden"


von Chris (Gast)


Lesenswert?

gibt es eine schnelle Möglichkeit (Win oder Linux), eine umfangreiche 
Tabelle mit etwa 30 Spalten jede Spalte auf ein maximum an Zeichen zu 
begrenzen?
Beispiel:

Input:
abcdefghijeklm:abcdefghije:abcdefghijekl:abcdefgh:abcdefghijeklmn

Vorgabe maximale Zeichen: Spalte 1=6 2=4 3=4 4=4 5=6

Output:
abcdef:abcd:abcd:abcd:abcdef

von N. M. (mani)


Lesenswert?

Chris schrieb:
> gibt es eine schnelle Möglichkeit

Schnell in der Erstellung oder schnell in der Ausführung?

Chris schrieb:
> eine umfangreiche Tabelle

Was bedeutet das? Dateiformat? Datenbank?

Chris schrieb:
> jede Spalte auf ein maximum an Zeichen zu begrenzen

Allgemein: nimm eine Scriptsprache. Ob Python, Powershell oder Bash 
sollte egal sein.
Substring, Trim, Take, Split oder ähnliche Befehle führen zum Ziel.

Ansonsten bekommt man das bestimmt auch mit Regex hin 😄

von Εrnst B. (ernst)


Lesenswert?

N. M. schrieb:
> Ansonsten bekommt man das bestimmt auch mit Regex hin
1
sed -E -e 's/^(.{0,6}).*?:(.{0,4}).*?:(.{0,4}).*?:(.{0,4}).*?:(.{0,6}).*?$/\1:\2:\3:\4:\5/'

aber mit mehr als 9 Spalten geht das nicht, gibt nur \1 bis \9

von WIRO (Gast)


Lesenswert?

So kann man es in einer Batchdatei machen. Die Eingangsdatei heißt im 
Beispiel "von.txt", die Ergebnisdatei "nach.txt". Dieses Beispiel 
verarbeitet die ersten 5 Spalten. Groß- und Kleinschreibung der 
Variablen a, A, B, C,... ist zu beachten!:
1
SETLOCAL ENABLEDELAYEDEXPANSION
2
copy nul nach.txt
3
for /f %%a in (von.txt) do (
4
for /f "tokens=1-5 delims=:" %%A in ("%%a") do (
5
  set tmp=%%A&set tmp=!tmp:~,6!&set result=!tmp!
6
  set tmp=%%B&set tmp=!tmp:~,4!&set result=!result!:!tmp!
7
  set tmp=%%C&set tmp=!tmp:~,4!&set result=!result!:!tmp!
8
  set tmp=%%D&set tmp=!tmp:~,4!&set result=!result!:!tmp!
9
  set tmp=%%E&set tmp=!tmp:~,6!&set result=!result!:!tmp!
10
  )
11
  echo !result!>>nach.txt
12
  )
13
ENDLOCAL
Bei Erweiterung auf 30 Spalten sind nach 'Z' die im Code folgenden 
Zeichen zu verwenden:
1
  set tmp=%%Z&set tmp=!tmp:~,6!&set result=!result!:!tmp!
2
  set tmp=%%[&set tmp=!tmp:~,6!&set result=!result!:!tmp!
3
  set tmp=%%\&set tmp=!tmp:~,6!&set result=!result!:!tmp!
4
  set tmp=%%]&set tmp=!tmp:~,6!&set result=!result!:!tmp!
5
  set tmp=%%^^&set tmp=!tmp:~,6!&set result=!result!:!tmp!
Enthält eine Spalte weniger Zeichen als die Begrenzung erlaubt, bleibt 
der Wert unverändert.
Gruß
WIRO

von WIRO (Gast)


Lesenswert?

Es lässt sich noch etwas vereinfachen:
1
SETLOCAL ENABLEDELAYEDEXPANSION
2
copy nul nach.txt
3
for /f %%a in (von.txt) do (
4
  for /f "tokens=1-30 delims=:" %%A in ("%%a") do (
5
    set tmp=%%A&set result=!tmp:~,6!
6
    set tmp=%%B&set result=!result!:!tmp:~,4!
7
    set tmp=%%C&set result=!result!:!tmp:~,4!
8
    set tmp=%%D&set result=!result!:!tmp:~,4!
9
    set tmp=%%E&set result=!result!:!tmp:~,6!
10
    )
11
  echo !result!>>nach.txt
12
  )
13
ENDLOCAL
Gruß
WIRO

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.