Zastępowanie podkreślenia przecinkiem i usuwanie podwójnych cudzysłowów w CSV


10

Mam plik CSV jako

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. i tak dalej.

Muszę przekonwertować ten plik CSV na

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85

Odpowiedzi:


24

Znacznie prostszym sposobem jest użycie tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Działa to w ten sposób, że trwymaga dwóch argumentów - zestawu znaków do zastąpienia i ich zamiany. W tym przypadku mamy tylko zestawy 1 znaku. Przekierowaniu input.csvwejściowy trstrumieniu użytkownika stdin przez <operatora, powłoki rur i uzyskaną wyjście tr -d '"'aby usunąć podwójne notowania.

Ale też awkmogę to zrobić.

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

Sposób działania jest nieco inny: awk odczytuje każdy plik linia po linii, każdy skrypt jest w linii /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Tutaj nie mamy wzorca, więc oznacza to wykonanie kodu dla każdej linii. gsub()funkcja jest używana do globalnego podstawiania w linii, dlatego używamy jej do zastępowania znaków podkreślenia przecinkami, a podwójnych cudzysłowów łańcuchem pustym (skutecznie usuwając znak). 1Jest w miejscu spotkania z wzorca brakuje blok kodu, który domyślnie po prostu do drukowania linii; innymi słowy, kod z gsub()robi zadanie i 1drukuje wynik.

Użyj przekierowania powłoki ( >), aby wysłać dane wyjściowe do nowego pliku:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv

Przepraszam. Chciałem też usunąć odwrócone przecinki. Zaktualizowałem pytanie
RKR

@RKR Odpowiedź odpowiednio zaktualizowana, odpowiedź Iana również została zaktualizowana
Sergiy Kolodyazhnyy

13

Alternatywnie możesz również użyć tego sedpolecenia:

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

1
W ramach pojedynczych cytatów nie musisz unikać podwójnego cytatu.
glenn jackman

Rzeczywiście @glennjackman! Właśnie usunąłem uciekający odwrotny ukośnik
IanC

10

Perl, „szwajcarska piła łańcuchowa armii” przetwarzania tekstu wiersza poleceń, może to również zrobić. Składnia jest (nieprzypadkowo) dość podobna do przykładów tri sed:

perl -pe 'tr/_"/,/d' input.csv > result.csv

lub:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

Ale szczerze mówiąc, jeśli nie chcesz poświęcić czasu na naukę nowego języka programowania (tak naprawdę jest to awk, Perl i sed i inne podobne narzędzia) tylko do tego podstawowego zadania, równie dobrze możesz to zrobić w dowolny edytor tekstu, który obsługuje wyszukiwanie i zamianę:

  1. Otwórz plik CSV w swoim ulubionym edytorze tekstu (takim jak gedit, kate, podkładka pod mysz itp.; Nawet zwykły stary Notatnik lub Wordpad w systemie Windows może to zrobić).

  2. Wybierz „Wyszukaj i zamień” z menu (zwykle znajduje się w „Edytuj”, jeśli nie ma osobnego menu „Wyszukaj”).

  3. Wejdź _w pole wyszukiwania i ,pole zastępcze.

  4. Kliknij „Zamień wszystko”.

  5. Powtórz za pomocą "w polu wyszukiwania i nic w polu zamiennym.

  6. Zapisz plik.

Teraz, jeśli musisz to zrobić dla 100 lub 1000 plików zamiast tylko jednego, wówczas nauka nowego narzędzia wiersza poleceń zaczyna mieć sens. I oczywiście, gdy już będziesz wiedział, jak używać Perla, seda itp., Zaoszczędzisz dużo czasu i wysiłku dzięki podobnym zadaniom później. Ale w przypadku jednorazowej pracy, której nie spodziewasz się wykonywać ponownie, czasem podstawowe interaktywne narzędzie, takie jak edytor tekstu, jest najprostszym rozwiązaniem.


3

Możesz to również zrobić vim.

Otwórz plik:, vim input.csva następnie użyj vimzaawansowanego narzędzia wyszukiwania s. Wpisz colon ( :), aby przejść do trybu poleceń, i uruchom następujące polecenia:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

Prawie takie same polecenia jak w odpowiedzi IanC, ale wewnątrz vimzamiast używać sed.


2

Dlaczego nie zmienić domyślnych wartości wejściowych i wyjściowych wartości separatora

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.