Страница 1 из 2

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

Добавлено: 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 - разделитель групп точек.

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

Добавлено: 28 фев 2018, 17:12
rhot
А какого вида csv был до этого?

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 Сидоров

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

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

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

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

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

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

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

Добавлено: 28 фев 2018, 18:59
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()

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

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

Добавлено: 28 фев 2018, 20:05
trir
TypeError: 'encoding' is an invalid keyword argument for this function

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

with open(fname_in) as f:
или запусти в python3

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

Добавлено: 28 фев 2018, 20:31
rhot
Ага, скрипт работает в Windows 7, Python 3.4

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

Добавлено: 28 фев 2018, 21:35
Игорь Лебедь
Большое спасибо! Работает на Python 3.5.1 в win7!

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

Добавлено: 28 фев 2018, 22:32
freeExec
Чисто из любопытства, кто потом ждёт такие разделители в csv? На практике такое первый раз встречаю.

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=''), но что поправить, пока не ясно.

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

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

Добавлено: 01 мар 2018, 07:44
trir

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

wr.writerow(unicode([item]))