Парсинг CSV в Java - рабочий пример..? [закрытый]

arr должен иметь одинаковый размер во всех экземплярах вашего класса. no является константой, но это означает только то, что она никогда не изменяется после создания экземпляра. Это не означает, что оно одинаково для всех случаев все время. Например, no можно установить в списке инициализатора конструктора

Foo::Foo(int size) : no(size)
{}

. По этой причине, если вы не сделаете no статическим, вы не сможете использовать его в качестве размера массива, поскольку это подразумевает потенциально разные по размеру массивы в каждом случае.

17
задан Andy Schmidt 9 May 2009 в 20:32
поделиться

7 ответов

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

  • Нахожу библиотеку, которая делает то, что я хочу. Если такой библиотеки нет, то , затем реализуйте ее.
  • Если библиотека существует, но я не уверен, что она подойдет для моих нужд, напишите вокруг нее тонкий адаптер API, поэтому Я могу контролировать, как это называется. API адаптера выражает потребности API I и сопоставляет эти вызовы с базовым API.
  • Если библиотека не подходит, я могу заменить другую под API адаптера (будь то еще одна программа с открытым исходным кодом или что-то, что я пишу сам) с минимальными усилиями, не затрагивая вызывающих.

Начните с того, что кто-то уже написал. Скорее всего, он сделает то, что вы хотите. При необходимости вы всегда можете написать свое позже. OpenCSV - такая же хорошая отправная точка, как и любая другая.

не затрагивая вызывающих абонентов.

Начните с того, что кто-то уже написал. Скорее всего, он сделает то, что вы хотите. При необходимости вы всегда можете написать свое позже. OpenCSV - такая же хорошая отправная точка, как и любая другая.

не затрагивая вызывающих абонентов.

Начните с того, что кто-то уже написал. Скорее всего, он сделает то, что вы хотите. При необходимости вы всегда можете написать свое позже. OpenCSV - такая же хорошая отправная точка, как и любой другой.

7
ответ дан 30 November 2019 в 10:50
поделиться

I would recommend that you start by pulling your task apart into it's component parts.

  1. Read string data from a CSV
  2. Convert string data to appropriate format

Once you do that, it should be fairly trivial to use one of the libraries you link to (which most certainly will handle task #1). Then iterate through the returned values, and cast/convert each String value to the value you want.

If the question is how to convert strings to different objects, it's going to depend on what format you are starting with, and what format you want to wind up with.

DateFormat.parse(), for example, will parse dates from strings. See SimpleDateFormat for quickly constructing a DateFormat for a certain string representation. Integer.parseInt() will prase integers from strings.

Currency, you'll have to decide how you want to capture it. If you want to just capture as a float, then Float.parseFloat() will do the trick (just use String.replace() to remove all $ and commas before you parse it). Or you can parse into a BigDecimal (so you don't have rounding problems). There may be a better class for currency handling (I don't do much of that, so am not familiar with that area of the JDK).

0
ответ дан 30 November 2019 в 10:50
поделиться

У вас также есть библиотека Apache Commons CSV , возможно, она делает то, что вам нужно. См. руководство . Обновлено до версии 1.1 в 2014-11 гг.

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

18
ответ дан 30 November 2019 в 10:50
поделиться

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

Если вы сейчас не установите разделитель, это будет невозможно, поэтому вам нужно как-то выяснить. Если вы можете выполнить проверку файла вручную, вы сможете быстро увидеть, что это такое, и жестко запрограммировать его в своей программе. Если разделитель может варьироваться, ваша единственная надежда - это определить, исходя из форматирования известных данных. Когда Excel импортирует файлы CSV, он позволяет пользователю выбирать разделитель, и это решение, которое вы также можете использовать.

2
ответ дан 30 November 2019 в 10:50
поделиться

5 лет назад мне приходилось использовать парсер csv. кажется, есть по крайней мере два стандарта csv: http://en.wikipedia.org/wiki/Comma-separated_values ​​ и то, что Microsoft делает в Excel.

Я нашел этот libaray, который ест оба: http://ostermiller.org/utils/CSV.html , но, черт возьми, он не может определить, какой тип данных был у столбцов.

2
ответ дан 30 November 2019 в 10:50
поделиться

Basically you will need to read the file line by line.

Then you will need to split each line by the delimiter, say a comma (CSV stands for comma-separated values), with

String[] strArr=line.split(",");

This will turn it into an array of strings which you can then manipulate, for example with

String name=strArr[0];
int yearOfBirth = Integer.valueOf(strArr[1]);
int monthOfBirth = Integer.valueOf(strArr[2]);
int dayOfBirth = Integer.valueOf(strArr[3]);
GregorianCalendar dob=new GregorianCalendar(yearOfBirth, monthOfBirth, dayOfBirth);
Student student=new Student(name, dob); //lets pretend you are creating instances of Student

You will need to do this for every line so wrap this code into a while loop. (If you don't know the delimiter just open the file in a text editor.)

0
ответ дан 30 November 2019 в 10:50
поделиться

Как минимум, вам необходимо знать разделитель столбцов.

0
ответ дан 30 November 2019 в 10:50
поделиться
Другие вопросы по тегам:

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