منبع اصلی نوشتار زیر در این لینک قرار دارد

آموزش خواندن و پردازش فایل CSV در جاوا

در این آموزش می خواهیم نحوه خواندن و پردازش فیلدها و خطوط یک فایل CSV در جاوا و به روش های مختلف را بررسی کنیم.

فایل با فرمت CSV چیست؟

یک فایل CSV یک فایل متنی ساده که در واقع داده ها را به شکل سطر و ستون های یک جدول ذخیره کرده می کند که جداکننده هر ستون  یا همان فیلد، یک کاما (کاراکتر

,
) است.

گاهی ستون ها با tab هم جدا می شوند اما این شیوه معمول نیست. و بدیهی است که هر سطر جدول هم با کاراکتر انتهای خط یا همان کاراکتر خط جدید، از سطر دیگر جدا شده است.

فایل های CSV برای انتقال اطلاعات بین دستگاه های روی شبکه و خروجی و پشتیبان گرفتن از سیستم ها بسیار معمول و پر استفاده هستند.

در این مطلب ما به سراغ شیوه های مختلفی برای خواندن و پردازش یک فایل CSV می رویم و هر کدام را بررسی می کنیم. ابتدا مثالی از محتوای یک فایل ساده CSV را نشان می دهیم که مقادیر هر خط آن با کاراکتر

,
جدا شده اند و در ادامه آموزش از آن استفاده خواهیم کرد.

1,John Doe,[email protected],AE
2,Alex Jones,[email protected],DE
3,Jovan Lee,[email protected],FR
4,Greg Hover,[email protected],US

نام این فایل users.csv است.

خواندن فایل CSV بدون کتابخانه اضافی در جاوا

برای خواندن و پردازش یک فایل ساده CSV که داخل خود فیلدها کامای اضافی ندارد و کاما تنها در نقش جداکننده به کار رفته (مثل فایلی که بالاتر نشان دادیم)، کلاس های استاندارد جاوا کافی هستند.

شما می توانید یا از کلاس

BufferedReader
استفاده کنید و یا از کلاس
Scanner
که به سادگی فایلی را از جاوا بخوانید.

کلاس BufferedReader

از آنجا که CSV یک فایل متنی ساده است، می توان کلاس

BufferedReader
را برای خواندن خط به خط آن به کار برد. سپس می توانید با بهره گیری از تابع split از کلاس
String
هر خط خوانده شده را با مشخص کاما به عنوان جداکننده، به بخش های مختلف تقسیم کنید. به این ترتیب مقادیر ستون ها و فیلدهای مختلف به دست می آیند.

به مثال زیر دقت کنید:

// create a reader
try (BufferedReader br = Files.newBufferedReader(Paths.get("users.csv"))) {

    // CSV file delimiter
    String DELIMITER = ",";

    // read the file line by line
    String line;
    while ((line = br.readLine()) != null) {

        // convert line into columns
        String[] columns = line.split(DELIMITER);

        // print all columns
        System.out.println("User["+ String.join(", ", columns) +"]");
    }

} catch (IOException ex) {
    ex.printStackTrace();
}

به این وسیله، خروجی به شکل زیر حاصل می شود:

User[1, John Doe, [email protected], AE]
User[2, Alex Jones, [email protected], DE]
User[3, Jovan Lee, [email protected], FR]
User[4, Greg Hover, [email protected], US]

 

کلاس Scanner

راهی دیگر برای خواندن و پردازش یک فایل CSV استفاده از کلاس

Scanner
است. این کلاس قابلیت جداسازی خط خوانده شده با جداکننده مشخص شده را دارد. در واقع این کلاس می تواند حتی الگویی پیچیده در قالب عبارات باقاعده را دریافت کند و برای جداسازی و ساخت توکن استفاده کند. سپس می تواند مقادیر جداشده را به نوع داده های متفاوتی هم تبدیل کند. مثلا با فراخوان تابع
nextInt
از این کلاس، مقدار خوانده و جدا شده را به عدد صحیح تبدیل می کند.

اینجا یک مثال داریم که شیوه به کارگیری کلاس

Scanner
برای خواندن مقادیر فایل CSV را نشان می دهد:

// create scanner instance
try (Scanner scanner = new Scanner(Paths.get("users.csv").toFile())) {

    // CSV file delimiter
    String DELIMITER = ",";

    // set comma as delimiter
    scanner.useDelimiter(DELIMITER);

    // read all fields
    while (scanner.hasNext()) {
        System.out.print(scanner.next() + " ");
    }

} catch (IOException ex) {
    ex.printStackTrace();
}

از کد بالا خروجی زیر روی کنسول حاصل می شود:

1 John Doe [email protected] AE
2 Alex Jones [email protected] DE
3 Jovan Lee [email protected] FR
4 Greg Hover [email protected] US

 

خواندن فایل CSV با کتابخانه OpenCSV

OpenCSV یک کتابخانه محبوب برای خواندن، نوشتن و پردازش فایل های CSV در جاوا است. این کتابخانه انتخابی عالی برای مواقعی است که با انواع مختلفی از جداکننده ها و کاراکترهای خاص سر و کار دارید.

برای اضافه کردن امکان پشتیبانی از OpenCSV در پروژه Gradle خود، موارد اعلام وابستگی زیر را در فایل

build.gradle
اضافه کنید:

implementation 'com.opencsv:opencsv:5.0'

اما اگر مدیریت وابستگی های پروژه شما از نوع Maven است موارد زیر را در فایل

pom.xml
اضافه کنید تا بتوانید از OpenCSV استفاده کنید:

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.0</version>
</dependency>

مثال زیر شیوه خواندن و پردازش فایل CSV با کمک OpenCSV را نشان می دهد. فایل CSV استفاده شده، همان است که در ابتدای این مطلب نشان داده شد.

// create a csv reader
try (Reader reader = Files.newBufferedReader(Paths.get("users.csv"));
     CSVReader csvReader = new CSVReader(reader)) {

    // read one record at a time
    String[] record;
    while ((record = csvReader.readNext()) != null) {
        System.out.println("User["+ String.join(", ", record) +"]");
    }

} catch (IOException | CsvValidationException ex) {
    ex.printStackTrace();
}

خروجی هم به شکل زیر است:

User[1, John Doe, [email protected], AE]
User[2, Alex Jones, [email protected], DE]
User[3, Jovan Lee, [email protected], FR]
User[4, Greg Hover, [email protected], US]

 

خواندن و پردازش فایل CSV به کمک Apache Commons CSV

Apache Commons CSV یک کتابخانه اصطلاحاً ۳rd-party است که برای خواندن و پردازش جاوا استفاده می شود. این کتابخانه امکانات مختلفی برای خواندن فایل CSV با فرمت های دلخواه ارائه می دهد.

برای استفاده در یک پروژه Gradle خط زیر را به فایل

build.gradle
اضافه کنید:

implementation 'org.apache.commons:commons-csv:1.7'

اما پروژه شما از نوع Maven است موارد زیر را در فایل

pom.xml
اضافه کنید:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.7</version>
</dependency>

کد زیر به عنوان یک مثال ارائه شده تا شما با نحوه استفاده از کتابخانه Apache Commons CSV برای خواندن و پردازش محتوای یک فایل CSV در جاوا، آشنا شوید.

// create a reader
try (Reader reader = Files.newBufferedReader(Paths.get("users.csv"))) {

    // read csv file
    Iterable<CSVRecord> records = CSVFormat.DEFAULT.parse(reader);
    for (CSVRecord record : records) {
        System.out.println("Record #: " + record.getRecordNumber());
        System.out.println("ID: " + record.get(0));
        System.out.println("Name: " + record.get(1));
        System.out.println("Email: " + record.get(2));
        System.out.println("Country: " + record.get(3));
    }

} catch (IOException ex) {
    ex.printStackTrace();
}

کد بالا خروجی زیر را به دست می دهد:

Record #: 1
ID: 1
Name: John Doe
Email: [email protected]
Country: AE
Record #: 2
ID: 2
Name: Alex Jones
Email: [email protected]
Country: DE
Record #: 3
ID: 3
Name: Jovan Lee
Email: [email protected]
Country: FR
Record #: 4
ID: 4
Name: Greg Hover
Email: [email protected]
Country: US

جمع بندی

اینها مواردی بود که می تواند به شما نشان دهد چطور می توانید مقادیر یک فایل CSV را بخوانید و ضمن جداسازی، آن ها را پردازش کنید. در این مطلب کوتاه، ما روش های مختلفی نگاه انداختیم، از نوشتن کد با کلاس های استاندارد جاوا تا کتابخانه Apache Commons CSV .

برای فایل های CSV ساده که مقادیر خود فیلدها شامل کاراکتر جداکننده کاما نمی شوند، کلاس های استاندارد جاوا مثل دو مورد اول که بررسی شد، به خوبی نیاز را در این زمینه برطرف می کنند. اما برای فایل های پیچیده که جداکننده ها و کاراکترهای خاصی دارند، باید به استفاده ار کتابخانه ها رجوع کنید.

اینجا دو مورد از محبوب ترین کتابخانه ها را معرفی شدند، اما من خودم OpenCSV را بیشتر می پسندم و توصیه می کنم؛ چرا که کتابخانه OpenCSV علاوه بر پشتیبانی از انواع زیادی از فرمت ها و کاراکترهای خاص، امکانات بیشتری را هم پیاده سازی کرده که پردازش فایل های CSV را ساده تر می کند.

 

امیدوارم این مطلب برای شما مفید بوده باشد و آن را با دوستان و همکاران خود به اشتراک بگذارید!

 

 

 

منبع: How to read and parse a CSV file in Java

نوشته آموزش خواندن و پردازش فایل CSV در جاوا اولین بار در اوپن مایند. پدیدار شد.



برچسب ها : ,