Междустрочный разделитель
- Игорь Лебедь
- Завсегдатай
- Сообщения: 452
- Зарегистрирован: 24 апр 2010, 19:47
- Репутация: 101
- Откуда: Город в клёнах и акациях
- Контактная информация:
Междустрочный разделитель
Всем привет!
Все, конечно, знают, как перевести точечный shp в csv.
Усложним задачу. csv должен иметь разделитель между группами [точек]. Как сделать это автоматом? PostGIS, QGIS и всё остальное приветствуется.
Примерный вид csv:
x y name
1230001.1 456434.001 Иванов
1230001.2 456566.001 Иванов
1230001.5 456567.001 Иванов
1230001.8 456005.001 Иванов
999 999 999
1250001.2 457566.001 Петров
1250001.5 457567.001 Петров
1250001.8 457005.001 Петров
999 999 999
1290001.2 458566.001 Сидоров
1290001.5 458567.001 Сидоров
1290001.8 458005.001 Сидоров
999 999 999
, где 999 999 999 - разделитель групп точек.
Все, конечно, знают, как перевести точечный shp в csv.
Усложним задачу. csv должен иметь разделитель между группами [точек]. Как сделать это автоматом? PostGIS, QGIS и всё остальное приветствуется.
Примерный вид csv:
x y name
1230001.1 456434.001 Иванов
1230001.2 456566.001 Иванов
1230001.5 456567.001 Иванов
1230001.8 456005.001 Иванов
999 999 999
1250001.2 457566.001 Петров
1250001.5 457567.001 Петров
1250001.8 457005.001 Петров
999 999 999
1290001.2 458566.001 Сидоров
1290001.5 458567.001 Сидоров
1290001.8 458005.001 Сидоров
999 999 999
, где 999 999 999 - разделитель групп точек.
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Re: Междустрочный разделитель
А какого вида csv был до этого?
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
- Игорь Лебедь
- Завсегдатай
- Сообщения: 452
- Зарегистрирован: 24 апр 2010, 19:47
- Репутация: 101
- Откуда: Город в клёнах и акациях
- Контактная информация:
Re: Междустрочный разделитель
До этого был классический csv, но без девяток. Вопрос, как разделить группы девятками, но не ручками, а автоматом.
x y name
1230001.1 456434.001 Иванов
1230001.2 456566.001 Иванов
1230001.5 456567.001 Иванов
1230001.8 456005.001 Иванов
1250001.2 457566.001 Петров
1250001.5 457567.001 Петров
1250001.8 457005.001 Петров
1290001.2 458566.001 Сидоров
1290001.5 458567.001 Сидоров
1290001.8 458005.001 Сидоров
-
- Гуру
- Сообщения: 1195
- Зарегистрирован: 23 апр 2011, 10:32
- Репутация: 205
- Откуда: Ульяновск
Re: Междустрочный разделитель
А какой принцип групп?
-
- Гуру
- Сообщения: 4057
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Междустрочный разделитель
пишите элементарную программу (R, Python, C++), которая что читает, то и выводит (прямо строку), после чтения парсит строку, и запоминает фамилию. Если фамилия поменялась, сначала выводит девятки (в конце тоже выводит девятки, а ФИО сначала равно $@$@$). Если данные немного (не сотни миллионов строк), то можно сначала прочитать, и сделать все в памяти. Если много, то писать лучше на С++, и обрабатывать построчно.
- Игорь Лебедь
- Завсегдатай
- Сообщения: 452
- Зарегистрирован: 24 апр 2010, 19:47
- Репутация: 101
- Откуда: Город в клёнах и акациях
- Контактная информация:
Re: Междустрочный разделитель
Однородное значение в третьем столбцеfreeExec писал(а): ↑28 фев 2018, 17:18А какой принцип групп?
под всем остальным имелись в виду ГИС и SQL - в том же кугисе ведь есть модули, которые парсят/группируют по полю, возможно есть что-то, что позволяет только добавить разделитель.gamm писал(а): ↑28 фев 2018, 17:23пишите элементарную программу (R, Python, C++)
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Re: Междустрочный разделитель
Если не найдёте, вот решение на Python:
Код: Выделить всё
import csv
fname_in = 'input_path_csv'
fname_out = 'output_path_csv'
with open(fname_in, encoding='utf-8') as f:
content = f.readlines()
content[0] = content[0].replace(u'\ufeff', '')
content = [x.strip() for x in content]
iz = []
dim = len(content)-1
k = 1
for i in range(dim):
sur1 = content[i].split()[2]
sur2 = content[i+1].split()[2]
if sur1 != sur2:
iz.append(i)
for m in range(len(iz)):
content.insert(iz[m]+k, '999 999 999')
k += 1
with open(fname_out, 'w', encoding='utf-8', newline='') as f:
wr = csv.writer(f)
for item in content:
wr.writerow([item])
f.close()
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
- Игорь Лебедь
- Завсегдатай
- Сообщения: 452
- Зарегистрирован: 24 апр 2010, 19:47
- Репутация: 101
- Откуда: Город в клёнах и акациях
- Контактная информация:
Re: Междустрочный разделитель
script.py", line 6, in <module>
with open(fname_in, encoding='utf-8') as f:
TypeError: 'encoding' is an invalid keyword argument for this function
with open(fname_in, encoding='utf-8') as f:
TypeError: 'encoding' is an invalid keyword argument for this function
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Междустрочный разделитель
TypeError: 'encoding' is an invalid keyword argument for this function
Код: Выделить всё
with open(fname_in) as f:
- rhot
- Гуру
- Сообщения: 1727
- Зарегистрирован: 25 янв 2011, 17:50
- Репутация: 194
- Ваше звание: доктор
- Откуда: Архангельск
Re: Междустрочный разделитель
Ага, скрипт работает в Windows 7, Python 3.4
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
- Игорь Лебедь
- Завсегдатай
- Сообщения: 452
- Зарегистрирован: 24 апр 2010, 19:47
- Репутация: 101
- Откуда: Город в клёнах и акациях
- Контактная информация:
Re: Междустрочный разделитель
Большое спасибо! Работает на Python 3.5.1 в win7!
-
- Гуру
- Сообщения: 1195
- Зарегистрирован: 23 апр 2011, 10:32
- Репутация: 205
- Откуда: Ульяновск
Re: Междустрочный разделитель
Чисто из любопытства, кто потом ждёт такие разделители в csv? На практике такое первый раз встречаю.
- Игорь Лебедь
- Завсегдатай
- Сообщения: 452
- Зарегистрирован: 24 апр 2010, 19:47
- Репутация: 101
- Откуда: Город в клёнах и акациях
- Контактная информация:
Re: Междустрочный разделитель
http://www.geoplat.pro/ru/?id=28freeExec писал(а): ↑28 фев 2018, 22:32Чисто из любопытства, кто потом ждёт такие разделители в csv?
Всё-таки, как поправить под 2.7?
Код: Выделить всё
line 25, in <module>
with open(fname_out, 'w', newline='') as f:
TypeError: 'newline' is an invalid keyword argument for this function
- Игорь Лебедь
- Завсегдатай
- Сообщения: 452
- Зарегистрирован: 24 апр 2010, 19:47
- Репутация: 101
- Откуда: Город в клёнах и акациях
- Контактная информация:
Re: Междустрочный разделитель
- Это победили, такИгорь Лебедь писал(а): ↑01 мар 2018, 00:02Понимаю, что в 2.7 нет такой функции (newline=''), но что поправить, пока не ясно.
Код: Выделить всё
import csv
fname_in = 'test.csv'
fname_out = 'test2.csv'
with open(fname_in) as f:
content = f.readlines()
content[0] = content[0].replace(u'\ufeff', '')
content = [x.strip() for x in content]
iz = []
dim = len(content)-1
k = 1
for i in range(dim):
sur1 = content[i].split()[2]
sur2 = content[i+1].split()[2]
if sur1 != sur2:
iz.append(i)
for m in range(len(iz)):
content.insert(iz[m]+k, '999 999 999')
k += 1
import io
with io.open(fname_out, 'w', newline='') as f:
wr = csv.writer(f)
for item in content:
wr.writerow([item])
f.close()
Код: Выделить всё
line 29, in <module>
wr.writerow([item])
TypeError: write() argument 1 must be unicode, not str
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Междустрочный разделитель
Код: Выделить всё
wr.writerow(unicode([item]))
Кто сейчас на конференции
Сейчас этот форум просматривают: Amazon [Bot] и 23 гостя