در این آموزش می خواهیم نحوه خواندن و پردازش فیلدها و خطوط یک فایل 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 در جاوا اولین بار در اوپن مایند. پدیدار شد.