![Analysieren Sie Daten anhand der Anzahl der Ziffern in Anführungszeichen](https://rvso.com/image/154465/Analysieren%20Sie%20Daten%20anhand%20der%20Anzahl%20der%20Ziffern%20in%20Anf%C3%BChrungszeichen.png)
Ich habe derzeit eine große Menge an Daten im aktuellen Format:
a:7:{i:0;s:4:"9999";i:1;s:4:"10000";i:2;s:4:"10001";i:3;s:4:"10002";i:4;s:4:"10003";i:5;s:4:"10004";i:6;s:4:"989";}
Die Zahlen ""
davor haben s:4
. Für Zahlen mit 3 Ziffern sollte dies in geändert werden s:3
, für Zahlen mit 5 Ziffern sollte dies sein s:5
und so weiter.
Die konvertierten Daten sollten folgendermaßen aussehen:
a:7:{i:0;s:4:"9999";i:1;s:5:"10000";i:2;s:5:"10001";i:3;s:5:"10002";i:4;s:5:"10003";i:5;s:5:"10004";i:6;s:3:"989";}
Jeder Datenstring {}
steht in einer eigenen Zeile indata.txt
Antwort1
Wie wäre es mit
perl -pe 's/s:\d+:"(.*?)"/sprintf("s:%d:\"%s\"",length($1),$1)/ge'
Ex.
$ echo 'a:7:{i:0;s:4:"9999";i:1;s:4:"10000";i:2;s:4:"10001";i:3;s:4:"10002";i:4;s:4:"10003";i:5;s:4:"10004";i:6;s:4:"989";}' |
perl -pe 's/s:\d+:"(.*?)"/sprintf("s:%d:\"%s\"",length($1),$1)/ge'
a:7:{i:0;s:4:"9999";i:1;s:5:"10000";i:2;s:5:"10001";i:3;s:5:"10002";i:4;s:5:"10003";i:5;s:5:"10004";i:6;s:3:"989";}
Sie können hinzufügen -i
, dass die Ersetzung direkt in der Datei durchgeführt wird.
Antwort2
#!/usr/bin/env bash
IFS=';'
while read LINE
do
set -- $LINE
while [ "$1" ]
do
if [[ $1 =~ ^s:[0-9]+:\".*\"$ ]]; then
s=${1##*:}
printf 's:%d:%s%s' $((${#s}-2)) "$s" "$IFS"
else
printf '%s%s' "$1" "$IFS"
fi
shift
done
printf '\n'
done < data.txt
Dieses Skript setzt das Feldtrennzeichen auf das Semikolon und durchläuft dann die Zeilen von data.txt
, wobei jede Zeile am Semikolon-Trennzeichen in separate Felder aufgeteilt wird. Für Felder, die mit beginnen s:###:"..."
(für beliebige Werte von ###
und ...
), berechnet das Skript die Länge der in Anführungszeichen gesetzten Zeichenfolge und formatiert das Feld mit diesem Längenwert neu und fügt ein abschließendes Feldtrennzeichen hinzu. Felder, die nicht dem Format entsprechen, s:###:"..."
werden unverändert ausgegeben, wobei das abschließende Feldtrennzeichen erneut hinzugefügt wird.
a:7:{i:0;s:4:"9999";i:1;s:5:"10000";i:2;s:5:"10001";i:3;s:5:"10002";i:4;s:5:"10003";i:5;s:5:"10004";i:6;s:3:"989";};