Парсинг CSV вводится с RegEx в Java

Да это является неподходящим.

, Если я помню правильно дважды, имеет приблизительно 17 значительного количества, поэтому обычно погрешности округления произойдут далеко позади десятичной точки. Большая часть финансового программного обеспечения использует 4 десятичных числа позади десятичной точки, которая оставляет 13 десятичных чисел для работы с так максимальным количеством, с которым можно работать для единственных операций, еще намного выше, чем государственный долг США. Но погрешности округления будут складывать со временем. Если Ваше программное обеспечение будет работать в течение долгого времени, то Вы в конечном счете начнете терять центы. Определенные операции сделают это хуже. Например, добавление больших сумм к небольшим количествам вызовет значительную потерю точности.

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

редактирование
Согласно этому сайту , который http://msdn.microsoft.com/en-us/library/678hzkk9.aspx Удваивает на самом деле, имеет 15 - 16 значащих цифр вместо 17.

@Jon десятичное число Стрельбы по тарелочкам более подходит, чем дважды из-за его более высокой точности, 28 или 29 значительных десятичных чисел. Это означает меньше шанса накопленных погрешностей округления, становящихся значительным. Типы данных фиксированной точки (т.е. целые числа, которые представляют центы или 100-й из цента как, я видел используемый) как упоминания Boojum, на самом деле лучше подходят.

16
задан Nathan Spears 17 September 2009 в 22:05
поделиться

3 ответа

Приоритет оператора. В основном нет. Все слева направо. Таким образом, or (|) применяется к опережающей закрывающей кавычке и опережающей запятой

Попробуйте:

(?:(?<=")([^"]*)(?="))|(?<=,|^)([^,]*)(?=,|$)
8
ответ дан 30 November 2019 в 22:17
поделиться

Когда я начал понимать, что я сделал не так, я также начал понимать, насколько запутанными были поисковые запросы. Я наконец понял, что мне нужен не весь совпадающий текст, а отдельные группы внутри него. В итоге я использовал что-то очень похожее на мой исходный RegEx, за исключением того, что я не смотрел вперед на закрывающую запятую, что, на мой взгляд, должно быть немного более эффективным. Вот мой последний код.

package regex.parser;

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CSVParser {

    /*
     * This Pattern will match on either quoted text or text between commas, including
     * whitespace, and accounting for beginning and end of line.
     */
    private final Pattern csvPattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?:,|$)");  
    private ArrayList<String> allMatches = null;    
    private Matcher matcher = null;
    private String match = null;
    private int size;

    public CSVParser() {        
        allMatches = new ArrayList<String>();
        matcher = null;
        match = null;
    }

    public String[] parse(String csvLine) {
        matcher = csvPattern.matcher(csvLine);
        allMatches.clear();
        String match;
        while (matcher.find()) {
            match = matcher.group(1);
            if (match!=null) {
                allMatches.add(match);
            }
            else {
                allMatches.add(matcher.group(2));
            }
        }

        size = allMatches.size();       
        if (size > 0) {
            return allMatches.toArray(new String[size]);
        }
        else {
            return new String[0];
        }           
    }   

    public static void main(String[] args) {        
        String lineinput = "the quick,\"brown, fox jumps\",over,\"the\",,\"lazy dog\"";

        CSVParser myCSV = new CSVParser();
        System.out.println("Testing CSVParser with: \n " + lineinput);
        for (String s : myCSV.parse(lineinput)) {
            System.out.println(s);
        }
    }

}
4
ответ дан 30 November 2019 в 22:17
поделиться

Я знаю, что OP не хочет этого, но для других читателей можно использовать один из методов String.replace для удаления кавычек из каждый элемент в массиве результатов текущего регулярного выражения OP.

2
ответ дан 30 November 2019 в 22:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: