как прочитать данные из *.csv

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Dull
Сообщения: 6
Зарегистрирован: 12 янв 2012, 20:31

как прочитать данные из *.csv

Сообщение Dull » 27 янв 2012, 19:49

как прочитать данные из *.csv , может прииведете пример.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: как прочитать данные из *.csv

Сообщение damager82 » 28 янв 2012, 23:02

Dull писал(а):как прочитать данные из *.csv , может прииведете пример.
В assets я закинул файл file.csv:

Код: Выделить всё

1,2,3
4,5,6
7,8,9
Код для разбора:

Код: Выделить всё

        final String separator = ",";
        try {
		BufferedReader br = new BufferedReader(new InputStreamReader(getAssets().open("file.csv")));
		String s = "";
		String[] data;
		while ( (s = br.readLine()) != null ) {
			data = s.split(separator);
			Log.d("tmp", data[0] + " " + data[1] + " " + data[2]);
		}
	} catch (IOException e) {
		// TODO Auto-generated catch block
	}
br.readLine - перебор строк,
а массив data содержит разобранную строку

Как-то так )
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: как прочитать данные из *.csv

Сообщение Xroft » 06 июн 2012, 02:35

Супер! это то что я искал. Спасибо!
Подскажите пожалуйста, как таблицу втянуть в SQLite.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: как прочитать данные из *.csv

Сообщение damager82 » 06 июн 2012, 09:28

Xroft писал(а):Супер! это то что я искал. Спасибо!
Подскажите пожалуйста, как таблицу втянуть в SQLite.
Создаем таблицу и insert-им туда данные. Об этом в уроке 34 инфа есть.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: как прочитать данные из *.csv

Сообщение Xroft » 07 июн 2012, 01:03

damager82 писал(а):
Xroft писал(а):Супер! это то что я искал. Спасибо!
Подскажите пожалуйста, как таблицу втянуть в SQLite.
Создаем таблицу и insert-им туда данные. Об этом в уроке 34 инфа есть.
Спасибо! Разобрался.
Втягивал как то вот так:) (понимаю что криво, только учусь)

Код: Выделить всё

private void myImport() {
		final String separator = ";";
		String name, ost, kol_in_box, tov_price;
        try {
                BufferedReader br = new BufferedReader(new InputStreamReader(getAssets().open("csv_import2.csv")));
                String s = "";
                String[] data;
                while ( (s = br.readLine()) != null ) {
                        data = s.split(separator);
                        Log.d(TAG, data[0] + " " + data[1] + " " + data[2] + " " + data[3] + " " + data[4]);
                        Log.d(TAG, "Втянули строку, едем дальше");
                        
                		    name = data[1];
                		    ost = data[2];
                		    kol_in_box = data[3];
                		    tov_price = data[4];
                			Log.d(TAG, "Пытаемся втянуть в базу товар " +data[1]);
                			long id = mDbHelper.InsertCSV(name, ost, kol_in_box, tov_price);
                				if (id > 0) {
                						mRowId = id;
                				}
                		
                }
        } catch (IOException e) { }
	}
В итоге в базу место кириллицы лезут кракозябры(.
Как это можно вылечить?

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: как прочитать данные из *.csv

Сообщение Xroft » 07 июн 2012, 11:05

Xroft писал(а):В итоге в базу место кириллицы лезут кракозябры(.
Как это можно вылечить?
Здравая логика подсказывает что надо или переопределить перменные name, ost, kol_in_box, tov_price как String или втягивать напрямую - сразу в базу. Или же (скорее всего) сам BufferedReader не понимает корректно кириллицу ...
Помогите разобратся пожалуйста.

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: как прочитать данные из *.csv

Сообщение damager82 » 08 июн 2012, 09:15

Xroft писал(а):В итоге в базу место кириллицы лезут кракозябры(. Как это можно вылечить?
getAssets().open - выдает кучу байтов. Кодировка еще не при делах.
BufferedReader работает уже с символами, а не байтами, кодировка уже не при делах.

За кодировку тут ответственный - InputStreamReader. Именно он переводит байты в символы. А чтобы ему это правильно сделать, он должен знать, по какой кодировке ему работать. По дефолту он юзает UTF-8, скорее всего. А вам надо ему явно указать, чтобы он Windows-1251 юзал.

Используйте другой конструктор:

Код: Выделить всё

new InputStreamReader(getAssets().open("csv_import2.csv"), "Windows-1251")
Если у вас файл в Windows-1251, конечно )
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: как прочитать данные из *.csv

Сообщение Xroft » 08 июн 2012, 18:31

damager82 писал(а):
Xroft писал(а):В итоге в базу место кириллицы лезут кракозябры(. Как это можно вылечить?
getAssets().open - выдает кучу байтов. Кодировка еще не при делах.
BufferedReader работает уже с символами, а не байтами, кодировка уже не при делах.

За кодировку тут ответственный - InputStreamReader. Именно он переводит байты в символы. А чтобы ему это правильно сделать, он должен знать, по какой кодировке ему работать. По дефолту он юзает UTF-8, скорее всего. А вам надо ему явно указать, чтобы он Windows-1251 юзал.

Используйте другой конструктор:

Код: Выделить всё

new InputStreamReader(getAssets().open("csv_import2.csv"), "Windows-1251")
Если у вас файл в Windows-1251, конечно )
Да, это то что доктор прописал... и снова огромное спасибо за помощь!:)

razmus
Сообщения: 82
Зарегистрирован: 26 мар 2013, 10:47

Re: как прочитать данные из *.csv

Сообщение razmus » 05 ноя 2013, 17:14

Подскажите, а можно ли потом заменить базу лежащую с assets?
К примеру, данные обновились и загрузить другой файл без пересборки приложения?
Заранее благодарен!

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: как прочитать данные из *.csv

Сообщение Foenix » 05 ноя 2013, 20:00

я думаю, никак нельзя, только пересобирать.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: как прочитать данные из *.csv

Сообщение trew » 05 ноя 2013, 20:26

razmus писал(а):Подскажите, а можно ли потом заменить базу лежащую с assets?
К примеру, данные обновились и загрузить другой файл без пересборки приложения?
Заранее благодарен!
Нужно попробовать следующим образом: переименовать готовый apk в zip.
И в папке assets подменить файл, затем переименовать обратно zip в apk.
Если нет в android проверки целостности файла, думаю получится.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

kk_gor
Сообщения: 9
Зарегистрирован: 07 ноя 2013, 01:39

Re: как прочитать данные из *.csv

Сообщение kk_gor » 07 ноя 2013, 01:51

Здравствуйте.
Тоже учусь импортировать из CSV и попалась "тупая" проблемка:

Есть CSV файл сохранен в UTF-8.
Первые строки:

Код: Выделить всё

art;in2013;dil
2104507021;5,61;
2104507022;5,61;
2105507021;5,71;
Из него тупо копирую в эклипс первую строку для проверки структуры, но дальше при сравнении скопированого и считаного андроидом он говорит что это две большие разницы :(

Полный код:

Код: Выделить всё

	
// Оновлення прайс-листа
	void readPriceFile() {
		try {
			// открываем поток для чтения
			BufferedReader br = new BufferedReader(new InputStreamReader(
					openFileInput(FILEPRICE)));
			String str = "";
			String str1 = "art;in2013;dil"; //Початок CSV з прайсом...
			// читаем содержимое
			str = br.readLine();
			if (str != null) {
				str.trim();
				if (str == str1) {
					while ((str = br.readLine()) != null) {
						String[] RowData = str.split(";");
						art = RowData[0];
						in2013 = RowData[1];
						dil = RowData[2];
					}
				} else {
					Toast.makeText(this, "Некоректний тип файлу.("+str+")",Toast.LENGTH_SHORT).show();
				}

			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			Toast.makeText(this, "Файл "+FILEPRICE+" не знайдено!",Toast.LENGTH_SHORT).show();			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
В чем может быть мой косяк?
Нутром чувствую что гдето здесь

Код: Выделить всё

 if (str == str1) {...
но понять не могу... можето потому что ночь уже :)
Спасибо. И спокойной ночи.
Последний раз редактировалось kk_gor 08 ноя 2013, 11:15, всего редактировалось 1 раз.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: как прочитать данные из *.csv

Сообщение Foenix » 07 ноя 2013, 10:04

за такое сравнение строк в java нужно наказывать принуждением прослушивания курса java на неделю!
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

razmus
Сообщения: 82
Зарегистрирован: 26 мар 2013, 10:47

Re: как прочитать данные из *.csv

Сообщение razmus » 07 ноя 2013, 13:05

kk_gor писал(а): Нутром чувствую ято гдето здесь

Код: Выделить всё

 if (str == str1) {...

Код: Выделить всё

str.equals(str1)
По своей, проблеме решил положить файл в память и заменять его сели нужно. Решение как оказалось работает точно с той же скоростью, что и при использовании assets.
Кусок кода для истории, подходит к первому в теме примеру.

Код: Выделить всё

		final File DATABASE_DIRECTORY = new File(
			   Environment.getExternalStorageDirectory(), "ImportExport");

			 final File Path = new File(DATABASE_DIRECTORY,"file.csv");

			BufferedReader br;
		try {
			br = new BufferedReader(new InputStreamReader(new FileInputStream(Path)));

Ответить