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

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

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

Сообщение Игорь Лебедь » 28 фев 2018, 17:10

Всем привет!
Все, конечно, знают, как перевести точечный 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 » 28 фев 2018, 17:12

А какого вида csv был до этого?
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

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

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

Сообщение Игорь Лебедь » 28 фев 2018, 17:15

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:18

Игорь Лебедь писал(а):
28 фев 2018, 17:10
Как сделать это автоматом?
А какой принцип групп?

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

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

Сообщение gamm » 28 фев 2018, 17:23

Игорь Лебедь писал(а):
28 фев 2018, 17:10
всё остальное приветствуется
пишите элементарную программу (R, Python, C++), которая что читает, то и выводит (прямо строку), после чтения парсит строку, и запоминает фамилию. Если фамилия поменялась, сначала выводит девятки (в конце тоже выводит девятки, а ФИО сначала равно $@$@$). Если данные немного (не сотни миллионов строк), то можно сначала прочитать, и сделать все в памяти. Если много, то писать лучше на С++, и обрабатывать построчно.

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

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

Сообщение Игорь Лебедь » 28 фев 2018, 18:18

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

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

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

Сообщение rhot » 28 фев 2018, 18:59

Если не найдёте, вот решение на 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: Междустрочный разделитель

Сообщение Игорь Лебедь » 28 фев 2018, 19:27

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

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

Сообщение trir » 28 фев 2018, 20:05

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 » 28 фев 2018, 20:31

Ага, скрипт работает в Windows 7, Python 3.4
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

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

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

Сообщение Игорь Лебедь » 28 фев 2018, 21:35

Большое спасибо! Работает на Python 3.5.1 в win7!

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

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

Сообщение freeExec » 28 фев 2018, 22:32

Чисто из любопытства, кто потом ждёт такие разделители в csv? На практике такое первый раз встречаю.

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

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

Сообщение Игорь Лебедь » 01 мар 2018, 00:02

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:40

Игорь Лебедь писал(а):
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
Гуру
Сообщения: 5292
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1015
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 01 мар 2018, 07:44

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

wr.writerow(unicode([item]))

Ответить

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

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

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