Apache CSVParser çalışmıyor

Aşağıdaki kod örneğini göz önünde bulundurun:

    private static CSVFormat CSV_FORMAT = CSVFormat.TDF;
    logger.debug("Processing record: {}", line);
    try {
        CSVParser parser = CSVParser.parse(line,CSV_FORMAT);
        if(parser.getRecords().isEmpty()) continue;
        csvRecord = parser.getRecords().get(0);
    } catch (IOException e) {
        logger.warn("Skipping line: " + line,e);
        continue;
    }

Nedense bu ayrıştırma değil. Aşağıdaki çıktıyı alıyorum:

DEBUG:
(OrderParser#parseData:121) - Processing record:
136147091   340834429   4/5/2015 4:35:00
PM  262105109   UFH6285 6   0   0   HWF62 Holmes Humidifier Replacement
Filter  8.99    53.94   0   39.91   0   8.09    0   5.94    5.12        7035997658  Marty   Joe [email protected] Jess
Dude        555 Main st     Anywhere    CA  900000  1

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

and even though you probably cannot see this via StackOverflow I guarantee there are tabs there. However, the index out of bounds exception occurs at parser.getRecords().get(0)

parser.getRecordNumber() 'a bir çağrı yaparsam, 1 rapor eder. Bunun karakter kodlama hatasından mı kaynaklandığını mı bilmiyorum.

İstenildiği gibi, işte ön etiketin içine yerleştirilmiş bazı örnek girdiler. Burada iki satır var, ama ben sadece ikincisini gönderiyorum:

SNumber RecD    Receip_ID   ListingID   Date_Entered    234 ReferenceId QT  QT2 QT3 Title   P456    Product_Rev Sh2687t Product Shipping    Comm    ShipFee PerItemFee  Tax_Cost    Company HoneCode    Bill455 Bill788 Email   Ship468644  Ship6489    Ship654132158   Ship98198   Ship_To_City    Ship_To_State   Ship_To_Zip ShippingMethodId
2644    7775    11457   26894   4/9/2015 9:47:00 AM 247520128   700364  1   0   0   Shark Navigator 14.99   14.99   0   11.75   0   2.25    0   0.99    0       84698   Shawn   Vanloan [email protected]  S Vanloo        166 E Main Rd       Anywhere    NY  12000   1

1
Evet, dediğim gibi: Sanmıyorum SO haydi insanlar kopyalayıp yapıştırma sekmesi karakterleri
katma yazar IcedDante, kaynak
Evet, dediğim gibi: Sanmıyorum SO haydi insanlar kopyalayıp yapıştırma sekmesi karakterleri
katma yazar IcedDante, kaynak
Evet, dediğim gibi: Sanmıyorum SO haydi insanlar kopyalayıp yapıştırma sekmesi karakterleri
katma yazar IcedDante, kaynak
Geri bildirim için teşekkür ederiz: Pre'in bizim için mevcut olduğunu bilmiyordum, bu yüzden şimdi bu verileri ekledim ve hassas bilgileri yeniden düzenledim
katma yazar IcedDante, kaynak
Geri bildirim için teşekkür ederiz: Pre'in bizim için mevcut olduğunu bilmiyordum, bu yüzden şimdi bu verileri ekledim ve hassas bilgileri yeniden düzenledim
katma yazar IcedDante, kaynak
Geri bildirim için teşekkür ederiz: Pre'in bizim için mevcut olduğunu bilmiyordum, bu yüzden şimdi bu verileri ekledim ve hassas bilgileri yeniden düzenledim
katma yazar IcedDante, kaynak
Aslında, düzenlediğinizde, sekmeleri görebilirsiniz, bu yüzden kesinlikle sana inanıyorum. Ancak, lütfen kendiniz düzenleyin ve çıktıyı
  etiketlerinin içine yeniden yapıştırın - bir tırnak biçimleme biçimi kullanmış olmanız, orada yeni çizgiler de ekliyor gibi görünüyor. Veya belki de yeni satırlar çıktınızdan geldi?  line  'da kaç satır var?
katma yazar RealSkeptic, kaynak
Aslında, düzenlediğinizde, sekmeleri görebilirsiniz, bu yüzden kesinlikle sana inanıyorum. Ancak, lütfen kendiniz düzenleyin ve çıktıyı
  etiketlerinin içine yeniden yapıştırın - bir tırnak biçimleme biçimi kullanmış olmanız, orada yeni çizgiler de ekliyor gibi görünüyor. Veya belki de yeni satırlar çıktınızdan geldi?  line  'da kaç satır var?
katma yazar RealSkeptic, kaynak
Aslında, düzenlediğinizde, sekmeleri görebilirsiniz, bu yüzden kesinlikle sana inanıyorum. Ancak, lütfen kendiniz düzenleyin ve çıktıyı
  etiketlerinin içine yeniden yapıştırın - bir tırnak biçimleme biçimi kullanmış olmanız, orada yeni çizgiler de ekliyor gibi görünüyor. Veya belki de yeni satırlar çıktınızdan geldi?  line  'da kaç satır var?
katma yazar RealSkeptic, kaynak
Eh, yukarıda sahip olduğunuz çıktı, TAB karakterleri yerine açıkça boşluklara sahip.
katma yazar SnakeDoc, kaynak
CSV'nizden bir örnek pastebin.com gibi bir şeye koyup buraya bağlamayı deneyin. Programınızın ne okuduğunu görmeden, bunu ayıklamak zordur. (Ayrıca, hassas müşteri bilgisi ise, adları ve adresleri daha genel bir şeyle değiştirin)
katma yazar SnakeDoc, kaynak
CSV'nizden bir örnek pastebin.com gibi bir şeye koyup buraya bağlamayı deneyin. Programınızın ne okuduğunu görmeden, bunu ayıklamak zordur. (Ayrıca, hassas müşteri bilgisi ise, adları ve adresleri daha genel bir şeyle değiştirin)
katma yazar SnakeDoc, kaynak
CSV'nizden bir örnek pastebin.com gibi bir şeye koyup buraya bağlamayı deneyin. Programınızın ne okuduğunu görmeden, bunu ayıklamak zordur. (Ayrıca, hassas müşteri bilgisi ise, adları ve adresleri daha genel bir şeyle değiştirin)
katma yazar SnakeDoc, kaynak

6 cevap

Apidocs'a göre, parser.getRecords() dosyayı verilen biçime göre ayrıştırır ve içeriği liste olarak döndürür. Ayrıştırma konumu girişin sonunda olacaktır. Bu nedenle parser.getRecords() adlı başka bir çağrı, boş bir liste döndürür.

Giriş kaydını akıllıca ayrıştırmayı düşünün.

apidocs

2
katma
Ah evet, vurdun. CSVParser'ın aslında yinelenebilir olduğunu ve beni mahvettiğini bilmiyordum. "İteratör" kelimesinin sınıf adına yazılması gerektiğine inanıyorum, ama belki de API’yi daha ayrıntılı incelememem için bir bahane!
katma yazar IcedDante, kaynak

Apidocs'a göre, parser.getRecords() dosyayı verilen biçime göre ayrıştırır ve içeriği liste olarak döndürür. Ayrıştırma konumu girişin sonunda olacaktır. Bu nedenle parser.getRecords() adlı başka bir çağrı, boş bir liste döndürür.

Giriş kaydını akıllıca ayrıştırmayı düşünün.

apidocs

2
katma
Ah evet, vurdun. CSVParser'ın aslında yinelenebilir olduğunu ve beni mahvettiğini bilmiyordum. "İteratör" kelimesinin sınıf adına yazılması gerektiğine inanıyorum, ama belki de API’yi daha ayrıntılı incelememem için bir bahane!
katma yazar IcedDante, kaynak

Apidocs'a göre, parser.getRecords() dosyayı verilen biçime göre ayrıştırır ve içeriği liste olarak döndürür. Ayrıştırma konumu girişin sonunda olacaktır. Bu nedenle parser.getRecords() adlı başka bir çağrı, boş bir liste döndürür.

Giriş kaydını akıllıca ayrıştırmayı düşünün.

apidocs

2
katma
Ah evet, vurdun. CSVParser'ın aslında yinelenebilir olduğunu ve beni mahvettiğini bilmiyordum. "İteratör" kelimesinin sınıf adına yazılması gerektiğine inanıyorum, ama belki de API’yi daha ayrıntılı incelememem için bir bahane!
katma yazar IcedDante, kaynak

Peter Zheng'in cevabı beni doğru yöne başlattı. Benim için çözüm, CSVParser.parse çağrıldıktan sonra kodda geldi. Bu aslında bir yinelenebilir döndürür, ben de aşağıdakilerle devam ettim:

CSVParser parser = ... //Any method for obtaining a parser
for(CSVRecord record : parser) {

    //Code for operating on the record here
}
0
katma

Peter Zheng'in cevabı beni doğru yöne başlattı. Benim için çözüm, CSVParser.parse çağrıldıktan sonra kodda geldi. Bu aslında bir yinelenebilir döndürür, ben de aşağıdakilerle devam ettim:

CSVParser parser = ... //Any method for obtaining a parser
for(CSVRecord record : parser) {

    //Code for operating on the record here
}
0
katma

Peter Zheng'in cevabı beni doğru yöne başlattı. Benim için çözüm, CSVParser.parse çağrıldıktan sonra kodda geldi. Bu aslında bir yinelenebilir döndürür, ben de aşağıdakilerle devam ettim:

CSVParser parser = ... //Any method for obtaining a parser
for(CSVRecord record : parser) {

    //Code for operating on the record here
}
0
katma