2015-08-20 19 views
8

Uzak bir ana bilgisayardan okunan ve bir hedef dosyaya ayrıştırılan büyük bir .csv dosyasına (yaklaşık 300 MB) sahibim, ancak tüm satırları hedef dosyaya kopyalamanıza gerek yok. Kopyalama yaparken, her satırı kaynağından okumalı ve eğer bazı yüklemleri geçerse, satırı hedef dosyaya ekleyeceğim.Büyük bir dosyayı CSVParser ile nasıl işlerim?

Apache CSV (apache.commons.csv) sadece bu yüzden BufferedReader kullanamaz tüm dosyayı

CSVFormat csvFileFormat = CSVFormat.EXCEL.withHeader(); 
CSVParser csvFileParser = new CSVParser("filePath", csvFileFormat); 
List<CSVRecord> csvRecords = csvFileParser.getRecords(); 

ayrıştırmak olduğunu varsayalım. Koduma dayanarak, her satır için etkin olmayan bir new CSVParser() örneği oluşturulmalıdır.

Yukarıdaki durumdaki tek bir satırı (tablonun bilinen başlığı ile) nasıl ayrıştırabilirim?

cevap

10

Ne yaparsanız yapın, dosyanızdaki tüm veriler yerel makinenize gelecektir çünkü sisteminizin geçerliliğini belirlemek için ayrıştırması gerekir. Dosya, ayrıştırıcıda okunan bir dosya aracılığıyla (her satırı ayrıştırabilmeniz için) veya tüm dosyanın yalnızca ayrıştırma amacıyla kopyalanıp kopyalanmayacağına bakılmaksızın, hepsi yerel olarak gelir. Verileri yerel almanız, ardından fazlalığı kırpmanız gerekir.

csvFileParser.getRecords() çağrısı zaten kayıp bir savaştır, çünkü the documentation bu yöntemin dosyanızın her satırını belleğe yüklediğini açıklar. Aktif hafızayı korurken kaydı ayrıştırmak için, her bir kayıt üzerinde yinelemelisiniz; belgeler bir seferde Aşağıdaki kod yükleri belleğe bir kayıt ima:

CSVParser csvFileParser = CSVParser.parse(new File("filePath"), csvFileFormat); 

for (CSVRecord csvRecord : csvFileParser) { 
    ... // qualify the csvRecord; output qualified row to new file and flush as needed. 
} 

Eğer "filePath" yerel olmadığını açıkladı olmadığından yukarıda çözüm nedeniyle bağlantı sorunları için başarısızlık eğilimli. Bağlantı sorunlarını gidermek için, uzaktaki dosyanın tamamını yerel olarak kopyalamanızı, sağlama toplamlarını karşılaştırarak dosyanın doğru bir şekilde kopyalanmasını, hedef dosyanızı oluşturmak için yerel kopyayı ayrıştırmanızı ve tamamlandıktan sonra yerel kopyayı silmenizi öneririz.

0

Bu geç bir yanıttır, ancak CSVParser ile BufferedReader kullanmak CAN:

try (BufferedReader reader = new BufferedReader(new FileReader(fileName), 1048576 * 10)) { 
    Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(reader); 
    for (CSVRecord line: records) { 
     // Process each line here 
    } 
catch (...) { // handle exceptions from your bufferedreader here 
İlgili konular