Междустрочный разделитель

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 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 - разделитель групп точек.
Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Междустрочный разделитель

Сообщение rhot »

А какого вида csv был до этого?
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 452
Зарегистрирован: 24 апр 2010, 19:47
Репутация: 101
Откуда: Город в клёнах и акациях
Контактная информация:

Re: Междустрочный разделитель

Сообщение Игорь Лебедь »

rhot писал(а): 28 фев 2018, 17:12А какого вида csv был до этого?
До этого был классический 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 Сидоров
freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: Междустрочный разделитель

Сообщение freeExec »

Игорь Лебедь писал(а): 28 фев 2018, 17:10Как сделать это автоматом?
А какой принцип групп?
gamm
Гуру
Сообщения: 4177
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Междустрочный разделитель

Сообщение gamm »

Игорь Лебедь писал(а): 28 фев 2018, 17:10всё остальное приветствуется
пишите элементарную программу (R, Python, C++), которая что читает, то и выводит (прямо строку), после чтения парсит строку, и запоминает фамилию. Если фамилия поменялась, сначала выводит девятки (в конце тоже выводит девятки, а ФИО сначала равно $@$@$). Если данные немного (не сотни миллионов строк), то можно сначала прочитать, и сделать все в памяти. Если много, то писать лучше на С++, и обрабатывать построчно.
Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 452
Зарегистрирован: 24 апр 2010, 19:47
Репутация: 101
Откуда: Город в клёнах и акациях
Контактная информация:

Re: Междустрочный разделитель

Сообщение Игорь Лебедь »

freeExec писал(а): 28 фев 2018, 17:18А какой принцип групп?
Однородное значение в третьем столбце
gamm писал(а): 28 фев 2018, 17:23пишите элементарную программу (R, Python, C++)
под всем остальным имелись в виду ГИС и SQL - в том же кугисе ведь есть модули, которые парсят/группируют по полю, возможно есть что-то, что позволяет только добавить разделитель.
Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Междустрочный разделитель

Сообщение rhot »

Если не найдёте, вот решение на 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
trir
Гуру
Сообщения: 5362
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Междустрочный разделитель

Сообщение trir »

TypeError: 'encoding' is an invalid keyword argument for this function

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

with open(fname_in) as f:
или запусти в python3
Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Междустрочный разделитель

Сообщение rhot »

Ага, скрипт работает в Windows 7, Python 3.4
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________
Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 452
Зарегистрирован: 24 апр 2010, 19:47
Репутация: 101
Откуда: Город в клёнах и акациях
Контактная информация:

Re: Междустрочный разделитель

Сообщение Игорь Лебедь »

Большое спасибо! Работает на Python 3.5.1 в win7!
freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: Междустрочный разделитель

Сообщение freeExec »

Чисто из любопытства, кто потом ждёт такие разделители в csv? На практике такое первый раз встречаю.
Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 452
Зарегистрирован: 24 апр 2010, 19:47
Репутация: 101
Откуда: Город в клёнах и акациях
Контактная информация:

Re: Междустрочный разделитель

Сообщение Игорь Лебедь »

freeExec писал(а): 28 фев 2018, 22:32Чисто из любопытства, кто потом ждёт такие разделители в csv?
http://www.geoplat.pro/ru/?id=28

Всё-таки, как поправить под 2.7?

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

line 25, in <module>
    with open(fname_out, 'w', newline='') as f:
TypeError: 'newline' is an invalid keyword argument for this function
Понимаю, что в 2.7 нет такой функции (newline=''), но что поправить, пока не ясно.
Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 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
trir
Гуру
Сообщения: 5362
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Междустрочный разделитель

Сообщение trir »

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

wr.writerow(unicode([item]))
Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей