2011-04-08 6 views
16

Mam plik tekstowy w formacie:Jak przekonwertować plik oddzielony tabulatorami na format CSV?

{ 

attribute1 attribute2 attribute3.... attributeN 

value"A" value"B" value"C".... value"Z" 

/* next line of values*/ 

} 

Każde słowo jest oddzielony za pomocą karty.

Jak przekonwertować na format CSV? Próbowałem używać programu Excel, ale powoduje to problemy ze zgodnością.

+0

Należy zauważyć, że plik CSV nie jest bardzo zdefiniowanym formatem. Niektórzy używają ";" jako separator, niektórzy używają ",". Formatowanie daty jest również bardzo zmienne, a opcja ograniczenia ciągów z "lub nie" Powinieneś wyjaśnić te wymagania z klientem (osobą lub procesem) –

Odpowiedz

22

Zaimportuj dane za pomocą programu Excel (Dane> Załaduj z pliku tekstowego), używając tabulatora jako separatora kolumn. Następnie zapisz plik jako csv.

Nie może mieć problemów ze zgodnością, jest to podstawowe zadanie i robiłem to dość często w przeszłości.

10

Jeśli można użyć scripting language, może dać Python strzał:

import csv 

# read tab-delimited file 
with open('yourfile.tsv','rb') as fin: 
    cr = csv.reader(fin, delimiter='\t') 
    filecontents = [line for line in cr] 

# write comma-delimited file (comma is the default delimiter) 
with open('yourfile.csv','wb') as fou: 
    cw = csv.writer(fou, quotechar='', quoting=csv.QUOTE_NONE) 
    cw.writerows(filecontents) 

Przykład interpretera sesji:

>>> import csv 
>>> with open('yourfile.tsv','rb') as fin: 
...  cr = csv.reader(fin, delimiter='\t') 
...  filecontents = [line for line in cr] 
... 
>>> with open('yourfile.csv','wb') as fou: 
...  cw = csv.writer(fou, quotechar='', quoting=csv.QUOTE_NONE) 
...  cw.writerows(filecontents) 
... 
>>> with open('yourfile.csv','rb') as see_how_it_turned_out: 
...  for line in see_how_it_turned_out: 
...   line 
... 
'attribute1,attribute2,attribute3,attributeN\r\n' 
'value"A",value"B",value"C",value"Z"\r\n' 

Uwagi:

Alternatywny przykład line-terminator:

with open('yourfile.csv','wb') as fou: 
    cw = csv.writer(fou,quotechar='',quoting=csv.QUOTE_NONE,lineterminator='\n') 
    ... 
0

Oto niektóre kodu VBA Excel że zrobi tej konwersji. Wklej to w wizualnym edytorze podstawowym programu Excel (Alt-F11) i uruchom go (oczywiście po zmianie nazw plików).

Sub TabToCsv() 

    Const ForReading = 1, ForWriting = 2 
    Dim fso, MyTabFile, MyCsvFile, FileName 
    Dim strFileContent as String 
    Set fso = CreateObject("Scripting.FileSystemObject") 

    ' Open the file for input. 
    Set MyTabFile = fso.OpenTextFile("c:\testfile.dat", ForReading) 

    ' Read the entire file and close. 
    strFileContent = MyTabFile.ReadAll 
    MyTabFile.Close 

    ' Replace tabs with commas. 
    strFileContent = Replace(expression:=strFileContent, _ 
          Find:=vbTab, Replace:=",") 
    ' Can use Chr(9) instead of vbTab. 

    ' Open a new file for output, write everything, and close. 
    Set MyCsvFile = fso.OpenTextFile("c:\testfile.csv", ForWriting, True) 
    MyCsvFile.Write strFileContent 
    MyCsvFile.Close 

End Sub 
+0

@jfc: powinien również upuścić puste wiersze i te z {i } –

+0

Dlaczego? Niekoniecznie Zależy od tego, co OP chce.Mój kod wypisuje plik w "formacie CSV" zgodnie z życzeniem, ale ["CSV" naprawdę oznacza tylko jedno] (http://en.wikipedia.org/wiki/ Wartości rozdzielane przecinkami): wartości są oddzielane przecinkami (zwykle) i liniami podziału Nie mogę przesądzać, czy OP potrzebuje 'i' 'i pustych wierszy w aplikacji odbiorcy.Jeśli OP daje jednoznaczny przykład pożądanego wyniku, wtedy będziemy mieli szansę odpowiedzieć poprawnie. –