Как спарсить CSV file in java

356
18 января 2018, 20:46
    "Вода минеральная Хорошо", 9.99, "минеральные воды", 0.3, "вода минеральная, лечебно-столовая", 570
    "Вода минеральная Хорошо", 15.47, "минеральные воды", 1.5, "вода минеральная, лечебно-столовая", 412
    "Пиво Одесское Новое", 13.25, "пиво", 0.5, 4.3%, 120
    "Красная испанка", 80.00, "вино", 0.75, 14%, 92
    "Сок Богач Грейпфрутовый", 22.00, "соки", 0.95, "вода, сок грейпфрутовый концентрированный, фруктоза, лимонная кислота", 156
    "Енерджи бум Плюс", 24.15, "прочие напитки", 0.33, "вода, лимонная кислота, ароматизатор Яблоко, Е-345, Е-120, Е-630, Е-632, краситель Вишня", 78
    "Мартини Биссе", "ликеры", 205.00, 1.0, 13%, 12
    "Два моря", 195.00, "вино", 0.75, 12%, 0

 public class StartClass {
        public static void main(String[] args) throws Exception {
            CSVReader reader = new CSVReader(new FileReader("C:\\Users\\November11\\Desktop\\byhlo.csv"), ',' , '"' , 1);       
            String[] nextLine;
            while ((nextLine = reader.readNext()) != null) {
                if (nextLine != null) {
                    System.out.println(Arrays.toString(nextLine));
                }
            }
        }
    }
"C:\Program Files\Java\jdk1.8.0_144\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.5\lib\idea_rt.jar=61932:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2017.2.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_144\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_144\jre\lib\rt.jar;C:\Users\November11\IdeaProjects\CSV_mag\out\production\CSV_mag;C:\Users\November11\Downloads\opencsv-4.1.jar" StartClass
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/lang3/ObjectUtils
    at com.opencsv.CSVParser.<init>(CSVParser.java:209)
    at com.opencsv.CSVReader.<init>(CSVReader.java:196)
    at com.opencsv.CSVReader.<init>(CSVReader.java:178)
    at com.opencsv.CSVReader.<init>(CSVReader.java:145)
    at StartClass.main(StartClass.java:11)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.lang3.ObjectUtils
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 5 more
Answer 1

Вот пожалуйста написал код для разбора CSV файлов вашего типа стандартными методами java:

Код основного файла:

package com.company;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class Main {
    //Основной метод приложения
    public static void main(String[] args) throws IOException {
        String filePath = "d:\\_ForSO\\CsvTest\\CsvFile.txt";
        List<Product> products = ParseProductCsv(filePath);
        //Тут вызов метода или прямая обработка полученных продуктов
    }
    //Расинг CSV файла по указанному пути и получение продуктов из него
    private static List<Product> ParseProductCsv(String filePath) throws IOException {
        //Загружаем строки из файла
        List<Product> products = new ArrayList<Product>();
        List<String> fileLines = Files.readAllLines(Paths.get(filePath));
        for (String fileLine : fileLines) {
            String[] splitedText = fileLine.split(",");
            ArrayList<String> columnList = new ArrayList<String>();
            for (int i = 0; i < splitedText.length; i++) {
                //Если колонка начинается на кавычки или заканчиваеться на кавычки
                if (IsColumnPart(splitedText[i])) {
                    String lastText = columnList.get(columnList.size() - 1);
                    columnList.set(columnList.size() - 1, lastText + ","+ splitedText[i]);
                } else {
                    columnList.add(splitedText[i]);
                }
            }
            Product product = new Product();
            product.Name = columnList.get(0);
            product.PurchasePrice = columnList.get(1);
            product.Group = columnList.get(2);
            product.Amount = columnList.get(3);
            product.Composition = columnList.get(4);
            product.Count = columnList.get(5);
            products.add(product);
        }
        return products;
    }
    //Проверка является ли колонка частью предыдущей колонки
    private static boolean IsColumnPart(String text) {
        String trimText = text.trim();
        //Если в тексте одна ковычка и текст на нее заканчиваеться значит это часть предыдущей колонки
        return trimText.indexOf("\"") == trimText.lastIndexOf("\"") && trimText.endsWith("\"");
    }
}

И соответственно код класса модели:

package com.company;
public class Product {
    public String Name;
    public String PurchasePrice;
    public String Group;
    public String Amount;
    public String Composition;
    public String Count;
}

Ну и напоследок скрин разобранного файла:

P.S. Дальше эту модель можно будет использовать для записи в БД.

READ ALSO
Не работает класс на андроид 4.4.х

Не работает класс на андроид 4.4.х

Столкнулся с проблемой в работоспособности кода на ранних версиях андроидаНа устройстве с ОС 7

240
Не прогружаются ноды, добавленные в Task JavaFX

Не прогружаются ноды, добавленные в Task JavaFX

Добрый деньУ меня идёт прогрузка сцены

253
Как изменить строку кода адаптера для соответствия фрагменту?

Как изменить строку кода адаптера для соответствия фрагменту?

У меня есть CursorAdapter для RecyclerView, написанный для активности, я решил перенести список в фрагмент, но не могу понять, как нужно изменить строку...

270