2016-03-18 15 views
0

Çift tırnaklı alanlarda kırılma çizgisine sahip bir CSV dosyası ayrışıyorum. Dosya satırını groovy komut dosyasıyla okuyorum ama eksik belirteçleri almaya çalıştığımda bir ArrayIndexOutBoundException alıyorum.Çift tırnaklı alanlarda n ile CSV dosyasını ayrıştırma

Bu karakterleri kaldırmak için dosyayı önceden işlemeye çalışıyordum ve bunu bazı bash komut dosyalarıyla veya groovy'nin kendisi ile yapmayı düşünüyordum.

Sorunu çözmek için kullanabileceğim herhangi bir yaklaşım önerebilir misiniz?

Sonunda bunu ve çalışır:

header1,header2,header3,header4 
timestamp, "abcdefghi", "abcdefghi","sdsd" 
timestamp, "zxcvb 
fffffgfg","asdasdasadsd","sdsdsd" 

Bu benim

def csv = new File(args[0]).text 
def bufferString = "" 
def parsedFile = new File("Parsed_" + args[0]); 

csv.eachLine { line, lineNumber -> 

    def splittedLine = line.split(','); 


    retString += new Date(splittedLine[0]) + ",${splittedLine[1]},${splittedLine[2]},${splittedLine[3]}\n"; 

     if(lineNumber % 1000 == 0){ 
       parsedFile.append(retString); 
       retString = ""; 
     } 

} 
parsedFile.append(retString); 

GÜNCELLEME

kullanıyorum harika script:

Bu

gibi CSV böyle görünüyor (İlk sütunu zaman damgası tarafından okunabilir bir tarihe formatladım):

gawk -F',' '{print strftime("%Y-%m-%d %H:%M:%S", substr($1, 0, length($1)-3))","($2)","($3)","($4)}' TobeParsed.csv > Parsed.csv 

sen kurtarmaya

+0

bir [Minimal, Tam, Doğrulanabilir örnekte] kod yayınlamak gerekir (http://stackoverflow.com/help/mcve) – pczeus

+2

muhtemelen gerçek csv kullanmalıdır ayrıştırıcı –

+1

Evet, https://github.com/xlson/groovycsv örneğin ... –

cevap

2

awk @karakfa ederiz!

bu

tırnak tek sayı bölünmüş alanını anlama ve OFS ile yeni bir satır yerine varsayar orada

$ awk -F'"' '!(NF%2){getline remainder;$0=$0 OFS remainder}1' splitted.csv 

header1,header2,header3 
xxxxxx, "abcdefghi", "abcdefghi" 
yyyyyy, "zxcvb fffffgfg","asdasdasadsd" 

hallederim işlemek birlikte yeni satır bölünmüş alanlarını birleştirilecek. Basit bir şekilde yeni satır silmek istiyorsanız (bölünmüş parçalar birleştirilecek) OFS'i kaldırın. Bunun yerine (eğer alıntı herhangi bir biçimde çalışmaz gördüğünüz gibi olan) bölünmüş bunu yapmaya çalışıyor daha uygun bir CSV ayrıştırıcı kullanırsanız

+0

için çok teşekkür ederim hızlı cevabın! Şimdi ihtiyacım olan şey bu. Bununla tüm sorunumu başka bir şey yapmadan çözebilirim. Sonunda yaptığım işte bu: 'gawk -F ',' '{print strftime ("% Y-% m-% d% H:% M:% S ", substr ($ 1, 0) , uzunluk ($ 1) -3)) "," ($ 2) "," ($ 3) "," ($ 4)} "TobeParsed.csv> Parsed.csv' Sadece awk'yi inkar ediyorum ama güçlü bir dil gibi görünüyor ! Çok teşekkür ederim! – mlavarreda

+1

Bir alanda 2 yeni satır varsa ve getline'ı yanlış kullanırsa (bkz. Http://awk.info/?tip/getline) yanıtdaki betik başarısız olur. Yorumdaki betik, OFS'nin uygun ve gereksiz parantezleri kullanması ve sorunuzla tamamen alakasız görünmesi durumunda sabit kodlama virgülleridir. @mlavarreda, Arnold Robbins'in “Etkileyici Awk Programming”, “4. Baskı” adlı kitabı aldı. –

+1

Ayrıca, kaçtılan alıntıları işlemez, ancak OP için önemli olmayabilir. 'getline var' kullanımı' $ 0' korur ve betik satır numaralarına bağlı değildir, bu yüzden bu durumda uygun bir kullanım gözükmektedir. – karakfa

4

, o zaman iyi çalışır:

@Grab('com.xlson.groovycsv:groovycsv:1.1') 
import static com.xlson.groovycsv.CsvParser.parseCsv 

def csv = '''header1,header2,header3,header4 
timestamp, "abcdefghi", "abcdefghi","sdsd" 
timestamp, "zxcvb 
fffffgfg","asdasdasadsd","sdsdsd"''' 

def data = parseCsv(csv) 
data.eachWithIndex { line, index -> 
    println """Line $index: 
       | 1:$line.header1 
       | 2:$line.header2 
       | 3:$line.header3 
       | 4:$line.header4""".stripMargin() 
} 

Hangi baskılar :

Line 0: 
    1:timestamp 
    2:abcdefghi 
    3:abcdefghi 
    4:sdsd 
Line 1: 
    1:timestamp 
    2:zxcvb 
fffffgfg 
    3:asdasdasadsd 
    4:sdsdsd 
+0

Teşekkür ederiz! Ben awk ile çözdüm. – mlavarreda

+1

Boruları tamir etmek için bant kullanmak gibi bir şey yok! İyi şanslar! –

İlgili konular