2011-06-29 20 views
6

Bir Java programında kullanabileceğim bir diziye CSV dosyası içe aktarmaya çalışıyorum. CSV dosyası başarıyla içe aktarıldı ve çıktı Terminalde görünüyor, ancak hata:Java'da Diziden CSV'ye Veri Ayrıştırma

sonunda atar. Ek olarak, dizideki öğeleri çağırmaya çalıştığımda, aynı hatayı da gösterir. Benim kod aşağıda:

import java.io.*; 
import java.util.*; 

public class CompareCSV { 

    public static void main(String[] args) { 

     String fileName = "sampledata1.csv"; 
     try { 
      BufferedReader br = new BufferedReader(new FileReader(fileName)); 
      String strLine = null; 
      StringTokenizer st = null; 
      int lineNumber = 0, tokenNumber = 0; 

      while((fileName = br.readLine()) != null) { 
       lineNumber++; 
       String[] result = fileName.split(","); 
       for (int x=0; x<result.length; x++) { 
        System.out.println(result[x]); 
       } 
      } 
     } 

     catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+2

Neden sonuç boyutuna değil, for döngüsünüzde sabit kodlanmış bir sabit kullanıyorsunuz? – Perception

+0

İhtiyaçlarınız için mevcut Java CSV API'sini kullanabilirsiniz: örneğin, http://sourceforge.net/projects/csv4j/ veya http://sourceforge.net/projects/javacsv/. –

+0

@Perception haklı, bir satır okuduktan sonra 3 değeriniz olduğundan emin misiniz? – Marcelo

cevap

6

Kendin kadar hatalı bir hack daha uygun bir CSV ayrıştırıcı kullanılarak çok daha iyi şunlardır: http://opencsv.sourceforge.net/

CSV biri düşünmeye izin olabilecek basit biçimde değil (evet, Bir satır, iki veri parçasını ayırmayan bir , içerebilir.

+0

Opencsv paketini bir Java programına nasıl çağırırsınız? Bunu daha önce uygulamayı denedim ve bir şekilde onu doğru anlamıyor gibi görünmüyordu. Düzenleme:///example dizinini buldum. –

+0

Tek bir "csv4j" kütüphanesi kullanmadan basit bir csv dosyasını ayrıştırabilmelidir ... –

+0

İnternet'teki diğer okumalar, CSV kütüphanelerinin çekilmesinin daha kolay olabileceğini gösterdi. Ama evet, basit bir CSV dosyasını, Java programının geri kalanında erişilebilen bir diziye kolayca nasıl ayrıştırılacağını biliyorsanız, bunu takdir ediyorum! –

0

Varsayımınız, her zaman dosyasındaki satırın tüm satırlar için üç sütunun bulunmadığı anlaşılıyor. happend, neden istisna ortadan kaldırmak ve görmek aşağıdaki satırı ile döngü deyimi için değiştirin:

for (int x=0; x<result.length; x++) 
2

Bu, yukarıda Soru

public class Readline { 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    String fileName = "C:/Users/karthikrao/Desktop/cvsFile.csv"; 
    ArrayList<Integer> margins = new ArrayList<Integer>(); 
    BufferedReader br; 
    String line, token; 
    int i; 
    try { 
     br = new BufferedReader(new FileReader(fileName)); 
     try { 
      while ((line = br.readLine()) != null) { 
       StringTokenizer st = new StringTokenizer(line, ",\""); 
       i = 0; 
       while (st.hasMoreTokens()) { 
        token = st.nextToken(); 
        if (margins.size() <= i) { 
         margins.add((Integer) token.length()); 
        } else { 
         margins.set(
           i, 
           Math.max(margins.get(i), 
             (Integer) token.length())); 
        } 
        i++; 
       } 
      } 

      br = new BufferedReader(new FileReader(fileName)); 
      while ((line = br.readLine()) != null) { 
       StringTokenizer st = new StringTokenizer(line, ",\""); 
       i = 0; 
       while (st.hasMoreTokens()) { 
        token = st.nextToken(); 
        System.out.print(token); 
        for (int j = 0; j < margins.get(i) - token.length(); j++) { 
         System.out.print(" "); 
        } 
        System.out.print("|"); 
        i++; 
       } 
       System.out.println(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

} 

}

2

için cevaptır seni değil önermek Dışarıda çok fazla büyük kütüphane olduğunda tekerleği yeniden icat etmek. Referans olarak aşağıdaki kod snippt ile uniVocity-parsers deneyin:

public static void main(String[] args) throws FileNotFoundException { 

    /** 
    * --------------------------------------- 
    * Read CSV rows into 2-dimensional array 
    * --------------------------------------- 
    */ 

    // 1st, creates a CSV parser with the configs 
    CsvParser parser = new CsvParser(new CsvParserSettings()); 

    // 2nd, parses all rows from the CSV file into a 2-dimensional array 
    List<String[]> resolvedData = parser.parseAll(new FileReader("/examples/example.csv")); 

    // 3rd, process the 2-dimensional array with business logic 
    // ...... 
} 

Gördüğünüz gibi, diziye csv veri ayrıştırma görevini tamamlamak için gereken sadece 2 satır. Ek olarak, kütüphane, mükemmel performans ile CSV verilerini ayrıştırmada özelliklerin tam listesini sağlar.