Как правильно импортировать число с плавающей запятой / double, являющееся строкой в ​​CSV-файле, в программу как float / double? - PullRequest
0 голосов
/ 29 декабря 2018

Введение

Я сделал простую программу, которая хранит данные в формате файла .csv, который позже читает для построения.Все сделано в Java.

Пример данных из файла csv:

2018/12/29
Tejido,321 908,13.55,43.18,$15.98,
Ropa,195 045,20.55,45.93,$123.01,
Gorra de visera,126 561,17.43,42.32,$79.54,
Cerveza,80 109,3.37,17.93,$12.38,
Mercancías de playa,75 065,11.48,39.73,$105.93,
Bebidas alcohólicas,31 215,4.84,27.90,$32.29,
Artículos de cuero,19 098,23.13,44.09,$198.74,

Что я пробовал до сих пор?

Прочитав и изучив документы, я пришел к этому решению, которое вполне адаптируется к моей проблеме (если оно сработало ...)

public class CSVinput {

public static void main(String[] args) throws FileNotFoundException
{
    Scanner scan = new Scanner(new File("produccion.csv"));
    scan.useDelimiter(",");

    while(scan.hasNext())
    {
        String date = scan.next();
        System.out.println(date);
        String name = scan.next();
        System.out.println(name);
        int quantity = Integer.parseInt(scan.next().replaceAll(" ", "."));
        System.out.println(quantity);
        double quality = Double.parseDouble(scan.next());
        System.out.println(quality);
        double realmQ = Double.parseDouble(scan.next());
        System.out.println(realmQ);
        double cost = Double.parseDouble(scan.nextLine());
        System.out.println(cost);

        if (scan.hasNextLine())
        {
            scan.nextLine();
            System.out.println(date+"," + name+"," + quantity+"," + quality+"," + realmQ+"," + cost);
        }
        scan.close();

    }


}
}

Где проблема?

Проблема в том, что когда я пытаюсь импортировать данные String и приводить их к double / float, который затем бросает в меня:

Exception in thread "main" java.lang.NumberFormatException: For input 
string: "13.55"

Я думаю, что если я проанализирую их в double, это будет больше, чемдостаточно, чтобы понять это правильно.

Ошибка полного исключения

Exception in thread "main" java.lang.NumberFormatException: For input string: "13.55"
at 

java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at webscrapper.CSVinput.main(CSVinput.java:29)
C:\Users\Jonathan\Desktop\WebScrapper_03\WebScrapper\nbproject\build- 
impl.xml:1339: The following error occurred while executing this line:
C:\Users\Jonathan\Desktop\WebScrapper_03\WebScrapper\nbproject\build- 
impl.xml:980: Java returned: 1
BUILD FAILED (total time: 1 second)

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Если вы отладите код, вы обнаружите, что при первом чтении:

String date = scan.next();
System.out.println(date);

переменной даты присваивается это значение:

2018/12/29\r\nTejido

С этого момента всенеправильно, очевидно.Конечно, одна ошибка заключается в том, что вы пытаетесь прочитать дату внутри цикла, но это не единственная причина ваших проблем.Почему вы используете next()?Вы должны прочитать файл, используя nextLine() и разделить каждую строку на ,:

public static void main(String[] args) {
    Scanner scan = null;
    try {
        scan = new Scanner(new File("produccion.csv"));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    if (scan == null)
        return;

    if (scan.hasNextLine()) {
        String date = scan.nextLine();
        System.out.println(date);
        while (scan.hasNextLine()) {
            String line = scan.nextLine();
            String[] tokens = line.split(",");

            String name = tokens[0];
            System.out.println(name);

            int quantity = Integer.parseInt(tokens[1].replace(" ", ""));
            System.out.println(quantity);

            double quality = Double.parseDouble(tokens[2]);
            System.out.println(quality);
            double realmQ = Double.parseDouble(tokens[3]);
            System.out.println(realmQ);
            double cost = Double.parseDouble(tokens[4].replace("$", ""));
            System.out.println(cost);

            System.out.println(date + "," + name + "," + quantity + "," + quality + "," + realmQ + "," + cost);
        }
        scan.close();
    }
}

Как видно из приведенного выше кода, необходимо 2 замены:От " " до "" для значений типа "321 908" и от "$" до "" для значений типа "$15.98"

0 голосов
/ 29 декабря 2018

Я вижу три проблемы:

  • Вы пытаетесь проанализировать одноразовую строку внутри цикла. Не делайте этого , поскольку это только смущает вас, когда вы вернетесь к отладке.

    Переместите этот код в вне цикла.

    Scanner scan = new Scanner(new File("produccion.csv"));
    scan.useDelimiter(",");
    String date = scan.nextLine();
    System.out.println(date);
    while(scan.hasNext())
    
  • После того, как вы это исправите, вы что-то делаете ... странно со строкой "321 908".

    int quantity = Integer.parseInt(scan.next().replaceAll(" ", "."));
    

    Представляет строку с пробелами, замененными точками, и пытается проанализировать ее как целое число.Теперь это может зависеть от того, какой разделитель тысяч вы используете нативно, но по умолчанию Java использует соглашение США о запятой (",") в качестве разделителя тысяч и точку (".") В качестве десятичного разделителя.

    Я не могу ответить на этот вопрос эмпирически, так как ваше намерение неясно, но как минимум, если вы избавитесь от всего пространства, вы получите инт ...

    int quantity = Integer.parseInt(scan.next().replaceAll(" ", ""));
    
  • Вам придется что-то сделать с этим знаком доллара перед другим номером.Вы не можете проанализировать двойное число с любым символом, который не является двойным, и валюта не является частью числа.Замените его аналогично тому, как вы делаете replaceAll для количества.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...