2015-08-20 7 views
8

मेरे पास एक बड़ी .csv फ़ाइल (लगभग 300 एमबी) है, जो रिमोट होस्ट से पढ़ी जाती है, और एक लक्षित फ़ाइल में पार्स की जाती है, लेकिन मुझे सभी पंक्तियों को लक्ष्य फ़ाइल में कॉपी करने की आवश्यकता नहीं है। प्रतिलिपि करते समय, मुझे स्रोत से प्रत्येक पंक्ति को पढ़ने की आवश्यकता है और यदि यह कुछ अनुमानित करता है, तो लक्ष्य फ़ाइल में पंक्ति जोड़ें।मैं CSVParser के माध्यम से एक बड़ी फ़ाइल को कैसे संसाधित कर सकता हूं?

मुझे लगता है कि अपाचे सीएसवी (apache.commons.csv) केवल पूरी फ़ाइल

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

पार्स कर सकते हैं तो मैं BufferedReader उपयोग नहीं कर सकते। मेरे कोड के आधार पर, new CSVParser() उदाहरण प्रत्येक पंक्ति के लिए बनाया जाना चाहिए, जो अक्षम दिखता है।

उपरोक्त मामले में मैं एक पंक्ति (तालिका के ज्ञात शीर्षलेख के साथ) कैसे पार्स कर सकता हूं?

उत्तर

10

कोई फर्क नहीं पड़ता कि आप क्या करते हैं, आपकी फाइल के सभी डेटा आपकी स्थानीय मशीन पर आ जाएंगे क्योंकि वैधता निर्धारित करने के लिए आपके सिस्टम को इसके माध्यम से विश्लेषण करना होगा। चाहे फ़ाइल पार्सर के माध्यम से पढ़ने वाली फ़ाइल के माध्यम से आती है (ताकि आप प्रत्येक पंक्ति को पार्स कर सकें), या आप पूरी फाइल को पार्सिंग उद्देश्यों के लिए कॉपी करते हैं, तो यह सब स्थानीय हो जाएगा। आपको डेटा स्थानीय प्राप्त करने की आवश्यकता होगी, फिर अतिरिक्त को ट्रिम करें।

कॉलिंग csvFileParser.getRecords() पहले से ही एक खोई हुई लड़ाई है क्योंकि the documentation बताती है कि यह विधि आपकी फ़ाइल की प्रत्येक पंक्ति को स्मृति में लोड करती है। सक्रिय स्मृति को संरक्षित करते समय रिकॉर्ड को पार्स करने के लिए, आपको प्रत्येक रिकॉर्ड पर इसके बजाय पुन: प्रयास करना चाहिए; प्रलेखन निम्नलिखित कोड भार एक समय में याद करने के लिए एक रिकॉर्ड का अर्थ है:

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. 
} 

जब से तुम स्पष्ट किया कि "filePath" स्थानीय नहीं है, इसके बाद के संस्करण समाधान कनेक्टिविटी समस्याओं के कारण असफलता की संभावना है। कनेक्टिविटी के मुद्दों को खत्म करने के लिए, मैं अनुशंसा करता हूं कि आप संपूर्ण रिमोट फ़ाइल को स्थानीय पर कॉपी करें, सुनिश्चित करें कि चेकसम की तुलना करके फ़ाइल की प्रतिलिपि बनाई गई फ़ाइल सुनिश्चित करें, स्थानीय प्रतिलिपि को अपनी लक्षित फ़ाइल बनाने के लिए पार्स करें, फिर पूरा होने के बाद स्थानीय प्रति हटाएं।

0

यह एक देर से प्रतिक्रिया है, लेकिन आप CSVParser के साथ एक BufferedReader का उपयोग कर सकते

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 
संबंधित मुद्दे

 संबंधित मुद्दे