Java के लिए CSV API [बंद]


164

क्या कोई सरल एपीआई की सिफारिश कर सकता है जो मुझे एक सीएसवी इनपुट फ़ाइल पढ़ने की अनुमति देगा, कुछ सरल रूपांतरण कर सकता है, और फिर इसे लिख सकता है।

एक त्वरित Google ने http://flatpack.sourceforge.net/ पाया है जो आशाजनक लगता है।

मैं सिर्फ यह जांचना चाहता था कि इस एपीआई से खुद को जोड़े रखने से पहले दूसरे क्या उपयोग कर रहे हैं।


सॉफ़्टवेयर लाइब्रेरी पर सुझाव मांगते समय बहन साइट सॉफ़्टवेयर अनुशंसाएँ स्टैक एक्सचेंज का उपयोग करें । है जावा और सीएसवी के लिए कई हिट
तुलसी बोर्क

जवाबों:


32

अपाचे कॉमन्स CSV

की जाँच करें अपाचे आम सीएसवी

यह लाइब्रेरी CSV के कई रूपों को पढ़ती है और लिखती है , जिसमें मानक एक RFC 4180 भी शामिल हैटैब-सीमांकित फ़ाइलों को भी पढ़ता / लिखता है ।

  • एक्सेल
  • InformixUnload
  • InformixUnloadCsv
  • माई एसक्यूएल
  • आकाशवाणी
  • PostgreSQLCsv
  • PostgreSQLText
  • RFC4180
  • TDF

मैंने काफी समय से सैंडबॉक्स वाले कॉमन्स CSV का उपयोग किया है और कभी भी समस्या का अनुभव नहीं किया है। मुझे वास्तव में उम्मीद है कि वे इसे पूरी तरह से बढ़ावा देने और सैंडबॉक्स से बाहर निकालने के लिए इसे बढ़ावा देंगे।
एलेक्स मार्शल

3
@ bmatthews68 सैंडबॉक्स लिंक डिफेक्ट है - ऐसा लगता है कि यह एपाचे कॉमन्स पर उचित तरीके से स्थानांतरित हो गया है (मैंने उत्तर में लिंक भी संपादित किया है)
drevicko

Apache Commons उदाहरण यहाँ: apisonar.com/java-examples/org.apache.commons.csv.html
APISonar

83

मैंने अतीत में OpenCSV का उपयोग किया है ।

import au.com.bytecode.opencsv.CSVReader;

स्ट्रिंग फ़ाइलनाम = "data.csv";
CSVReader रीडर = नया CSVReader (नया FileReader (fileName));

// यदि पहली पंक्ति हेडर है स्ट्रिंग [] हैडर = Reader.readNext ();
// iterate over Reader.readNext जब तक यह शून्य वापस नहीं आती है स्ट्रिंग [] लाइन = Reader.readNext ();

एक अन्य प्रश्न के उत्तर में कुछ अन्य विकल्प थे ।


दुर्भाग्य से, OpenCSV का नवीनतम डाउनलोड (टिप्पणी के समय v2.2) संकलन नहीं करता है, और वे पूर्व-निर्मित बाइनरी प्रदान नहीं करते हैं।
opyate

9
SourceForge से मैंने जो पैकेज डाउनलोड किया, उसमें तैनाती फ़ोल्डर में एक बाइनरी थी।
माइक सिकलर

8
यदि आप मावेन का उपयोग कर रहे हैं, तो कृपया ध्यान दें कि आधिकारिक वेबसाइट पर निर्भरता कोड में "2.0" संस्करण घोषणा है जिसमें कुछ बग हैं, लेकिन रिपॉजिटरी में अपडेटेड संस्करण 2.3 है।
बोगी जूल

यह लिबर अलग थ्रेड में फाइल नहीं लिखता है, नहीं?
इवोक्स

3
के अनुसार github.com/uniVocity/csv-parsers-comparison औसत 73% धीमे से uniVocity ..
इवोक

32

अपडेट: इस उत्तर में कोड सुपर सीएसवी 1.52 के लिए है। सुपर सीएसवी 2.4.0 के लिए अद्यतन कोड उदाहरण परियोजना की वेबसाइट पर देखे जा सकते हैं: http://super-csv.github.io/super-csv/index.html


सुपरसीवीवी परियोजना सीधे सीएसवी कोशिकाओं के पार्सिंग और संरचित हेरफेर का समर्थन करती है। से http://super-csv.github.io/super-csv/examples_reading.html आप मिल जाएगा जैसे

एक वर्ग दिया

public class UserBean {
    String username, password, street, town;
    int zip;

    public String getPassword() { return password; }
    public String getStreet() { return street; }
    public String getTown() { return town; }
    public String getUsername() { return username; }
    public int getZip() { return zip; }
    public void setPassword(String password) { this.password = password; }
    public void setStreet(String street) { this.street = street; }
    public void setTown(String town) { this.town = town; }
    public void setUsername(String username) { this.username = username; }
    public void setZip(int zip) { this.zip = zip; }
}

और आपके पास एक हेडर के साथ एक सीएसवी फ़ाइल है। चलो निम्नलिखित सामग्री मान लेते हैं

username, password,   date,        zip,  town
Klaus,    qwexyKiks,  17/1/2007,   1111, New York
Oufu,     bobilop,    10/10/2007,  4555, New York

फिर आप UserBean का एक उदाहरण बना सकते हैं और इसे निम्नलिखित कोड के साथ फाइल की दूसरी पंक्ति के मानों के साथ पॉप्युलेट कर सकते हैं

class ReadingObjects {
  public static void main(String[] args) throws Exception{
    ICsvBeanReader inFile = new CsvBeanReader(new FileReader("foo.csv"), CsvPreference.EXCEL_PREFERENCE);
    try {
      final String[] header = inFile.getCSVHeader(true);
      UserBean user;
      while( (user = inFile.read(UserBean.class, header, processors)) != null) {
        System.out.println(user.getZip());
      }
    } finally {
      inFile.close();
    }
  }
}

निम्नलिखित "हेरफेर विनिर्देश" का उपयोग करना

final CellProcessor[] processors = new CellProcessor[] {
    new Unique(new StrMinMax(5, 20)),
    new StrMinMax(8, 35),
    new ParseDate("dd/MM/yyyy"),
    new Optional(new ParseInt()),
    null
};

1
आपका कोड संकलित नहीं होगा इसलिए मैंने कुछ सुधार प्रस्तुत किए। इसके अलावा, ParseDate () सही ढंग से काम नहीं करता है इसलिए मैंने इसे एक स्ट्रिंग पढ़ने के लिए बदल दिया। इसे बाद में पार्स किया जा सकता है।

1
बड़ी सीमा: SuperCSV थ्रेडसेफ़ नहीं है, मैं जैक्सन को देखने जा रहा हूं, हालांकि यह अधिक सीमित हो सकता है
ZiglioUK

SuperCsv भी मल्टीमैप का उपयोग करने की अनुमति नहीं देता है। इसे MultiMaps के साथ काम करते हुए देखना अच्छा होगा।
सिड अप

19

CSV प्रारूप विवरण को पढ़ने से मुझे लगता है कि 3rd पार्टी लाइब्रेरी का उपयोग करना स्वयं लिखने से कम सिरदर्द होगा:

विकिपीडिया 10 या कुछ ज्ञात पुस्तकालयों को सूचीबद्ध करता है:

मैंने कुछ प्रकार की चेक सूची का उपयोग करके सूचीबद्ध लिबास की तुलना की। OpenCSV ने निम्न परिणामों के साथ मुझे (YMMV) विजेता बनाया:

+ maven

+ maven - release version   // had some cryptic issues at _Hudson_ with snapshot references => prefer to be on a safe side

+ code examples

+ open source   // as in "can hack myself if needed"

+ understandable javadoc   // as opposed to eg javadocs of _genjava gj-csv_

+ compact API   // YAGNI (note *flatpack* seems to have much richer API than OpenCSV)

- reference to specification used   // I really like it when people can explain what they're doing

- reference to _RFC 4180_ support   // would qualify as simplest form of specification to me

- releases changelog   // absence is quite a pity, given how simple it'd be to get with maven-changes-plugin   // _flatpack_, for comparison, has quite helpful changelog

+ bug tracking

+ active   // as in "can submit a bug and expect a fixed release soon"

+ positive feedback   // Recommended By 51 users at sourceforge (as of now)

8

हम JavaCSV का उपयोग करते हैं , यह बहुत अच्छी तरह से काम करता है


3
इस लाइब्रेरी के साथ एकमात्र मुद्दा यह है कि यह आपको विंडोज़ \r\nपर नहीं चलने पर विंडोज लाइन टर्मिनेटर ( ) के साथ सीएसवी फ़ाइलों को आउटपुट करने की अनुमति नहीं देगा । लेखक ने वर्षों से सहायता प्रदान नहीं की है। मुझे यह याद रखने की सुविधा देने के लिए कांटा लगाना पड़ा: JavaCSV 2.2
Mosty Mostacho

6

पिछले उद्यम आवेदन के लिए मैंने उस पर काम किया था, जिसे सीएसवी की एक उल्लेखनीय राशि को संभालने की जरूरत थी - कुछ महीने पहले - मैंने सुपरफोर्सवी को सोर्सफोर्ज में इस्तेमाल किया और इसे सरल, मजबूत और समस्या-मुक्त पाया।


सुपरसीवी के लिए +1, लेकिन इसमें कुछ गंदे कीड़े हैं जिन्हें अभी तक ठीक नहीं किया गया है, नए कीड़े वर्तमान में नहीं संभाले जाते हैं, और अंतिम रिलीज लगभग दो साल पुरानी है। लेकिन हम बिना किसी समस्या के उत्पादन में एक पैच / संशोधित संस्करण का उपयोग कर रहे हैं।
MRalwasser

2
@MRalwasser सुपर सीएसवी 2.0.0-बीटा -1 हाल ही में जारी किया गया है। इसमें कई बग फिक्स और नई विशेषताएं शामिल हैं (मेवेन समर्थन और नेस्टेड संपत्तियों और सरणियों / संग्रह को मैप करने के लिए एक नया डोजर एक्सटेंशन)
जेम्स बैसेट

1
@ हाउंड-डॉग अपडेट के लिए धन्यवाद, मैंने पहले से ही नए बीटा पर ध्यान दिया है और मैं इस परियोजना को जीवित देखकर खुश हूं - हालांकि कॉमिट्स की आवृत्ति अभी भी मुझे थोड़ा डरती है (लगभग सभी कुछ दिनों में ही शुरू हो जाती है)। लेकिन मैं देख लूंगा। क्या अंतिम 2.0 की अनुमानित रिलीज की तारीख है?
MRalwasser

2
@Malwasser मैं इस समय एकमात्र देव हूं और पूरे समय काम करता हूं, इसलिए जब भी मुझे मुफ्त सप्ताहांत मिलता है, तो मैं इस पर काम करता हूं - इसलिए छिटपुट शुरुआत होती है :) अब बीटा के लगभग 1000 एसएफ डाउनलोड, और कोई बग नहीं, तो अगले महीने की शुरुआत में एक अंतिम रिलीज के लिए ट्रैक पर देख रहे हैं। यदि आपके पास भविष्य की सुविधाओं के लिए कोई विचार है तो कृपया हमें बताएं।
जेम्स बैसेट

1
SuperCSV नहीं threadsafe है इस स्तर पर, कि बनाता है यह वास्तव में मजबूत नहीं imho पर
ZiglioUK

5

आप csvreader एपीआई का उपयोग कर सकते हैं और निम्न स्थान से डाउनलोड कर सकते हैं:

http://sourceforge.net/projects/javacsv/files/JavaCsv/JavaCsv%202.1/javacsv2.1.zip/download

या

http://sourceforge.net/projects/javacsv/

निम्नलिखित कोड का उपयोग करें:

/ ************ For Reading ***************/

import java.io.FileNotFoundException;
import java.io.IOException;

import com.csvreader.CsvReader;

public class CsvReaderExample {

    public static void main(String[] args) {
        try {

            CsvReader products = new CsvReader("products.csv");

            products.readHeaders();

            while (products.readRecord())
            {
                String productID = products.get("ProductID");
                String productName = products.get("ProductName");
                String supplierID = products.get("SupplierID");
                String categoryID = products.get("CategoryID");
                String quantityPerUnit = products.get("QuantityPerUnit");
                String unitPrice = products.get("UnitPrice");
                String unitsInStock = products.get("UnitsInStock");
                String unitsOnOrder = products.get("UnitsOnOrder");
                String reorderLevel = products.get("ReorderLevel");
                String discontinued = products.get("Discontinued");

                // perform program logic here
                System.out.println(productID + ":" + productName);
            }

            products.close();

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

    }

}

CSV फ़ाइल में लिखें / संलग्न करें

कोड:

/************* For Writing ***************************/

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import com.csvreader.CsvWriter;

public class CsvWriterAppendExample {

    public static void main(String[] args) {

        String outputFile = "users.csv";

        // before we open the file check to see if it already exists
        boolean alreadyExists = new File(outputFile).exists();

        try {
            // use FileWriter constructor that specifies open for appending
            CsvWriter csvOutput = new CsvWriter(new FileWriter(outputFile, true), ',');

            // if the file didn't already exist then we need to write out the header line
            if (!alreadyExists)
            {
                csvOutput.write("id");
                csvOutput.write("name");
                csvOutput.endRecord();
            }
            // else assume that the file already has the correct header line

            // write out a few records
            csvOutput.write("1");
            csvOutput.write("Bruce");
            csvOutput.endRecord();

            csvOutput.write("2");
            csvOutput.write("John");
            csvOutput.endRecord();

            csvOutput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}


2

सीएसवी प्रारूप स्ट्रिंगरॉकेनाइज़र के लिए काफी आसान लगता है लेकिन यह अधिक जटिल हो सकता है। यहाँ जर्मनी में एक अर्धविराम को एक सीमांकक के रूप में प्रयोग किया जाता है और सीमांकक युक्त कोशिकाओं को बच निकलने की आवश्यकता होती है। आप आसानी से StringTokenizer के साथ संभाल नहीं जा रहे हैं।

मैं http://sourceforge.net/projects/javacsv के लिए जाऊंगा


0

यदि आप एक्सेल से सीएसवी पढ़ने का इरादा रखते हैं, तो कुछ दिलचस्प कोने के मामले हैं। मैं उन सभी को याद नहीं कर सकता, लेकिन अपाचे कॉमन्स सीएसवी इसे सही तरीके से संभालने में सक्षम नहीं था (उदाहरण के लिए, यूआरएल)।

सभी जगह उद्धरण और अल्पविराम और स्लैश के साथ एक्सेल आउटपुट का परीक्षण करना सुनिश्चित करें।


अपाचे कॉमन्स सीएसवी पुस्तकालय की पेशकश करता है माइक्रोसॉफ्ट एक्सेल के लिए एक विशिष्ट प्रकार । मुझे नहीं पता कि क्या अब आपके द्वारा बताई गई समस्याओं को संभालती है या नहीं।
तुलसी बोर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.