Jak przekonwertować plik CSV na XML?

8

Jak przekonwertować plik CSV na XML?

Czy jest jakieś oprogramowanie dla Ubuntu?

Vitor Mazuco
źródło
Nie rozumiem. Trzy wymienione przez ciebie formaty to zwykłe pliki tekstowe - różnica polega na zawartości. I zakres. Czy mógłbyś dodać przykład?
Rmano
1
Głosowanie w celu ponownego otwarcia. Uważam to za dość proste i łatwe do odpowiedzi ;-)
Rinzwind
1
Wspieram Rinzwind, ponieważ właśnie poprosiłem o oprogramowanie, które można przekonwertować.
Vitor Mazuco

Odpowiedzi:

7

Na stronie internetowej społeczności dotyczącej konwersji znajduje się link do narzędzia wiersza polecenia o nazwie csv2xml . Ponieważ nie jest zachowane, możesz wybrać inną opcję.

Wspomniano także o narzędziu Java o nazwie csv2xml (ostrzeżenie: strona internetowa jest w języku niemieckim) oraz narzędziu wiersza poleceń o nazwie ff-extractor .

Link zawiera również odniesienia do Python, Perl, PHP, XSLT, ale oznacza to, że musisz samodzielnie kodować konwerter.

Rinzwind
źródło
1
Zaktualizowałem trochę referencje w 1. linku. Istnieje również produkt komercyjny o nazwie Altova ( altova.com ).
Rinzwind
10

Kiedy znasz format csvpliku i strukturę, której potrzebujesz w xmlpliku, dość łatwo jest utworzyć skrypt, który może obsłużyć konwersję.

Weź plik simple.csv:

Jack,35,United States
Jill,22,United Kingdom

Możesz utworzyć następujący xmlplik:

<?xml version="1.0"?>
<Customers>
  <Customer>
    <Name>Jack</Name>
    <Age>35</Age>
    <Country>United States</Country>
 </Customer>
 <Customer>
    <Name>Jill</Name>
    <Age>22</Age>
    <Country>United Kingdom</Country>
 </Customer>
</Customers>

Za pomocą następującego skryptu:

#!/bin/bash
file_in="simple.csv"
file_out="simple.xml"
echo '<?xml version="1.0"?>' > $file_out
echo '<Customers>' >> $file_out
while IFS=$',' read -r -a arry
do
  echo '  <Customer>' >> $file_out
  echo '    <Name>'${arry[0]}'</Name>' >> $file_out
  echo '    <Age>'${arry[1]}'</Age>' >> $file_out
  echo '    <Country>'${arry[2]}'</Country>' >> $file_out
  echo '  </Customer>' >> $file_out
done < $file_in
echo '</Customers>' >> $file_out

Nawet jeśli nigdy wcześniej nie kodowałeś, myślę, że powinno to być łatwe w użyciu i modyfikacji. Plik jest odczytywany linia po linii w whilepętli.

IFSjest wewnętrznym specyfikatorem pola. IFS=$','Oświadcza, że wartość separatora pól jest przecinek. Jest to standard dla pliku CSV, ale można go zmienić w razie potrzeby, aby dopasować format pliku wejściowego.

-rArgument readpolecenia informuje go traktować żadnych backslashy w pliku jako część danych, a nie jako uciec na poniższym szczególnym charakterze.

-a arryArgumentem umieszcza każdą kolumnę pliku do tablicy (nazwie arry). Kolumny w tym przykładzie to nazwa, wiek, kraj. Innymi słowy wartości między przecinkami. Tak więc każda kolumna w wierszu jest przechowywana w tablicy.

Następnie potrzebny tekst xmljest po prostu zawijany wokół wartości, a xmllinia jest dołączana do pliku wyjściowego za pomocą echo.

kolby
źródło
@chaskes, jeśli wyjaśnisz opcję użytą w linii while IFS=$',' read -r -a arry , jest przydatna dla innej. Dzięki.
alhelal
@BandaMuhammadAlHelal Done.
chaskes,
Jak poradziłbyś sobie z przecinkami pojawiającymi się w polach otoczonych podwójnymi cudzysłowami? Jak w "Somename, Jack"miejscu Jackpliku wejściowego?
muk.li
1
@ muk.li Separator pól wejściowych (zwykle przecinek) jest zaznaczony na początku linii: while IFS = $ ','. Powiedzmy, że separator jest gwiazdką, wystarczy zmienić go na: $ '*'. Więc w twoim przypadku powinno to być $ '”(pojedynczy cytat, podwójny cytat, pojedynczy cytat). Powinno to działać dobrze, ale cytowanie w powłoce może być trudne i nie miałem okazji go przetestować.
chaskes
1

Dość przyjaznym dla użytkownika (tzn. Łatwym w użyciu dla wielu osób takim jak ja) rozwiązaniem problemu konwersji CSV na XML jest użycie ładnego wieloplatformowego edytora XML z wbudowaną tą funkcją. (Używałem go zarówno pod Ubuntu, jak i Mac OSX 10.10.5; ma także plik wykonywalny dla systemu Windows).

XMLSpear

Jak wspomniano, jest to edytor XML, ale zawiera „import” CSV-na-XML (i Excel-na-XML) w menu głównym:

wprowadź opis zdjęcia tutaj

Przekształciłem dla mnie plik CSV o wielkości 31 Mb (zrzut z bazy danych bibliotek zawierającej 20 000 wpisów) w około 15 sekund, co daje mi dobrze sformatowany plik XML do zapisania i manipulowania.

Jako edytor ma wiele innych funkcji powitalnych (wyszczególnionych pod linkiem powyżej). Nie mogę znaleźć wzmianki o żadnej licencji na to, ale jest to zawarte w „README”:

XMLSpear to darmowe oprogramowanie do użytku osobistego.
Prześlij swoją opinię na adres [email protected] lub na forum http://donkeydevelopment.com/forums.

Zastosowanie komercyjne musi zostać zatwierdzone przez donkeydevelopment.
Wystarczy wysłać wiadomość e-mail na adres [email protected] z tematem „wniosek o licencję”.

Plik Readme zawiera również pomocną zawartość pliku .desktop.

Dobrze działa dla mnie pod Ubuntu 18.04 LTS (Gnome).

Dɑvïd
źródło
0

Jestem wielkim fanem tego, BaseXktóry wydaje się mieć możliwość importu:

http://docs.basex.org/wiki/CSV_Module


Może wskazać, że pozornie łatwiej jest korzystać z aplikacji internetowej:

https://webapps.stackexchange.com/q/123959/24327

Co oznacza wtyczkę lub rozszerzenie przeglądarki współpracujące z arkuszami Google.

Czuję twój ból, ponieważ jest to pozornie proste narzędzie, które powinno być dostępne przez apt.

Thufir
źródło
0

Sugerowałbym, abyś ty lub ktoś napisał kody w Pythonie. Python jest łatwy do opanowania i rozwiązania problemu. Ma zarówno moduł CSV, jak i XML . Moja sugestia bierze pod uwagę, że może być konieczne posiadanie własnych nazw elementów XML lub innych skomplikowanych wymagań (takich jak konwersja ostatniej kolumny CSV na atrybut ostatniej kolumny).

Istnieje mnóstwo samouczków online na temat Pythona.

Stefano Mtangoo
źródło