يمكنك يوصي جافا مكتبة للقراءة (وربما الكتابة) ملفات CSV ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/200609

  •  03-07-2019
  •  | 
  •  

سؤال

يمكنك يوصي جافا مكتبة للقراءة ، تحليل صحة و رسم الخرائط الصفوف في قيمة مفصولة بفواصل (CSV) ملف جافا قيمة الأشياء (JavaBeans)?

هل كانت مفيدة؟

المحلول

ولقد استخدمنا http://opencsv.sourceforge.net/ مع نجاح جيدة

وجئت أيضا عبر سؤال آخر مع وصلات جيدة: جافا ليب أو التطبيق لتحويل CSV إلى ملف XML؟

نصائح أخرى

سوبر CSV هو خيار كبير بالنسبة القراءة/تحليل صحة و رسم الخرائط ملفات CSV إلى POJOs!

نحن (سوبر CSV فريق) قد صدر للتو نسخة جديدة (يمكنك تحميل من سورس أو مخضرم).

القراءة من ملف CSV

يستخدم المثال التالي CsvDozerBeanReader (قارئ جديد لقد صدر للتو أن يستخدم البلدوزر عن الفول رسم الخرائط مع عميق رسم الخرائط على أساس مؤشر الدعم خرائط) - أنها تقوم على سبيل المثال من الموقع.إذا كنت لا تحتاج بلدوزر وظيفة (أو كنت ترغب فقط بسيطة مستقل التبعية), ثم يمكنك استخدام CsvBeanReader بدلا من ذلك (انظر هذه التعليمات البرمجية المثال).

على سبيل المثال ملف CSV

هنا هو مثال على ملف CSV الذي يمثل الردود على المسح.لديه رأس و 3 صفوف من البيانات ، مع كل 8 أعمدة.

age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3
18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory
,Y,1,Thirteen,2,Nikola Tesla,3,Stargate
42,N,1,,2,Carl Sagan,3,Star Wars

تحديد رسم الخرائط من CSV إلى POJO

كل صف من CSV سيتم قراءة في SurveyResponse فئة كل منها يحتوي على قائمة الجوابs.من أجل رسم خريطة العمل الخاصة بك يجب أن تكون الفصول صالح Javabeans (أنا.e افتراضي لا arg منشئ يكون حاصل/واضعي المحددة لكل مجال).

في سوبر CSV يمكنك تحديد الخرائط مع سلسلة بسيطة مجموعة - كل عنصر من الصفيف يتوافق مع عمود في ملف CSV.

مع CsvDozerBeanMapper يمكنك استخدام:

  • بسيطة مجال تعيينات (مثلا ، firstName)

  • عميق تعيينات (مثلا ، address.country.code)

  • فهرسة الخرائط (مثلا ، middleNames[1] - صفر على أساس مؤشر صفائف أو مجموعات)

  • عميق + فهرسة الخرائط (مثلا ، person.middleNames[1])

التالي هو مجال رسم الخرائط على سبيل المثال - يستخدم مزيج من هذه:

private static final String[] FIELD_MAPPING = new String[] { 
        "age",                   // simple field mapping (like for CsvBeanReader)
        "consentGiven",          // as above
        "answers[0].questionNo", // indexed (first element) + deep mapping
        "answers[0].answer", 
        "answers[1].questionNo", // indexed (second element) + deep mapping
        "answers[1].answer", 
        "answers[2].questionNo", 
        "answers[2].answer" };

التحويل و التحقق من صحة

سوبر CSV يحتوي على مكتبة مفيدة خلية المعالجات, التي يمكن استخدامها لتحويل السلاسل من ملف CSV إلى غيرها من أنواع البيانات (مثلا ، تاريخ عدد صحيح) ، أو القيام قيود التحقق من صحة (مثلا ، إلزامية/اختياري ، regex مطابقة فحص النطاق).

باستخدام خلية المعالجات اختياري تماما - بدونها كل عمود من CSV سوف تكون سلسلة ، وذلك في كل مجال يجب أن تكون سلسلة أيضا.

التالية هي خلية التكوين المعالج على سبيل المثال.كما هو الحال مع تعيين الحقل ، كل عنصر في المصفوفة يمثل العمود CSV.فإنه يوضح كيف خلية المعالجات يمكن تحويل البيانات CSV إلى نوع بيانات الحقل الخاص بك ، وكيف يمكن بالسلاسل معا.

final CellProcessor[] processors = new CellProcessor[] { 
    new Optional(new ParseInt()), // age
    new ParseBool(),              // consent
    new ParseInt(),               // questionNo 1
    new Optional(),               // answer 1
    new ParseInt(),               // questionNo 2
    new Optional(),               // answer 2
    new ParseInt(),               // questionNo 3
    new Optional()                // answer 3
};

القراءة

القراءة مع سوبر CSV مرنة جدا:كنت العرض الخاصة بك Reader (حتى يمكنك أن تقرأ من ملف ، classpath ، ملف مضغوط ، الخ) ، و محدد و اقتبس حرف شكلي عبر تفضيلات (وهناك عدد من المحددة مسبقا التكوينات التي تلبي معظم الأعراف).

رمز أدناه جميلة النفس التفسيرية.

  1. إنشاء القارئ (مع Reader والتفضيلات)

  2. (اختياريا) قراءة رأس

  3. تكوين الفول الخرائط

  4. تبقى الدعوة read() حتى تحصل على null (نهاية الملف)

  5. إغلاق قارئ

كود:

ICsvDozerBeanReader beanReader = null;
try {
    beanReader = new CsvDozerBeanReader(new FileReader(CSV_FILENAME),
        CsvPreference.STANDARD_PREFERENCE);

    beanReader.getHeader(true); // ignore the header
    beanReader.configureBeanMapping(SurveyResponse.class, FIELD_MAPPING);

    SurveyResponse surveyResponse;
    while( (surveyResponse = 
        beanReader.read(SurveyResponse.class, processors)) != null ) {
        System.out.println(
            String.format("lineNo=%s, rowNo=%s, surveyResponse=%s",
                beanReader.getLineNumber(), beanReader.getRowNumber(), 
                surveyResponse));
    }

} finally {
    if( beanReader != null ) {
        beanReader.close();
    }
}

الإخراج:

lineNo=2, rowNo=2, surveyResponse=SurveyResponse [age=18, consentGiven=true, answers=[Answer [questionNo=1, answer=Twelve], Answer [questionNo=2, answer=Albert Einstein], Answer [questionNo=3, answer=Big Bang Theory]]]
lineNo=3, rowNo=3, surveyResponse=SurveyResponse [age=null, consentGiven=true, answers=[Answer [questionNo=1, answer=Thirteen], Answer [questionNo=2, answer=Nikola Tesla], Answer [questionNo=3, answer=Stargate]]]
lineNo=4, rowNo=4, surveyResponse=SurveyResponse [age=42, consentGiven=false, answers=[Answer [questionNo=1, answer=null], Answer [questionNo=2, answer=Carl Sagan], Answer [questionNo=3, answer=Star Wars]]]

مزيد من المعلومات

يمكنك أن تجد الكثير من المعلومات على الموقع!

ويمكنني أن أوصي SuperCSV . سهلة الاستخدام، وفعل كل ما أحتاجه.

ومهلا، لدي مشروع مفتوح المصدر لذلك: JFileHelpers . أعتقد أن الميزة الرئيسية هي أنه يستخدم جافا الشروح، نلقي نظرة:

إذا كان لديك هذه الحبة:

@FixedLengthRecord()
public class Customer {
    @FieldFixedLength(4)
    public Integer custId;

    @FieldAlign(alignMode=AlignMode.Right)
    @FieldFixedLength(20)
    public String name;

    @FieldFixedLength(3)
    public Integer rating;

    @FieldTrim(trimMode=TrimMode.Right)
    @FieldFixedLength(10)
    @FieldConverter(converter = ConverterKind.Date, 
    format = "dd-MM-yyyy")
    public Date addedDate;

    @FieldFixedLength(3)
    @FieldOptional
    public String stockSimbol;    
}

ويريد أن تحليل هذا الملف:

....|....1....|....2....|....3....|....4                
1   Antonio Pereira     10012-12-1978ABC
2   Felipe Coury          201-01-2007
3   Anderson Polga       4212-11-2007DEF      

وكل ما عليك القيام به هو هذا:

FileHelperEngine<Customer> engine = 
    new FileHelperEngine<Customer>(Customer.class); 
List<Customer> customers = 
    new ArrayList<Customer>();

customers = engine.readResource(
    "/samples/customers-fixed.txt");

وبالإضافة إلى ذلك، فإنه يدعم السيد والتفاصيل وتاريخ وتحويل الشكل، وأكثر من ذلك كثيرا. اسمحوا لي أن أعرف ما هو رأيك!

وأطيب التحيات!

Flatpack لتكون جيدة حقا مع التعامل مع الملفات CSV ملتوي (هروب، ونقلت وسجلات سيئة، الخ.)

ووCSV ملف XML على سؤال طلب سابقا يبدو للرد على جميع أسئلتي.

وOpenCSV ( http://opencsv.sourceforge.net/ ) كما يفعل ملزمة لJavaBeans باستخدام العمود الوظيفة استراتيجية رسم الخرائط

  ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
  strat.setType(YourOrderBean.class);
  String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
  strat.setColumnMapping(columns);

  CsvToBean csv = new CsvToBean();
  List list = csv.parse(strat, yourReader);

وJSEFA ( http://jsefa.sourceforge.net ) ويبدو أيضا أن تفعل كل ما أحتاج - خاصة ملزمة إلى كائنات جافا - بالإضافة إلى دعم FLR وXML

ولقد كان نجاح جيدة على حد سواء تحليل وكتابة ملفات CSV من جاوة مع OpenCSV . إذا كنت ترغب في قراءة أو كتابة جداول البيانات إكسل متوافق مع جافا، و POI مكتبة من طراز أباتشي هي وسيلة للذهاب .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top