Таблица: как разделить одну строку на несколько строк

Вопросы общего характера по ГИС и дистанционному зондированию, не связанные с конкретным ПО.
JGBoBBy
Интересующийся
Сообщения: 17
Зарегистрирован: 03 июл 2008, 09:43
Репутация: 0

Таблица: как разделить одну строку на несколько строк

Сообщение JGBoBBy » 22 июл 2013, 14:02

Добрый день!

Есть таблица с полями[text1],[text2]. В поле [text1] содержится текст разделенный запятыми (без пробелов) - [txt1,txt2,txt3,...txtN], где N число непостоянное, т.е. в разных строках может быть разно количество кусков текста разделенных запятыми. Нужно получить таблицу, в которой берется поле text1 и на его основе создается N строк (в зависимости от N кусков текста в этой строке) и каждая строка в поле text1 заполняется дынными взятыми между запятыми. Поле text2 остается как и было.
Т.е. была таблица:
[a1,a2,a5,a8], [b10]
[с2,c4],[b15]
Нужно получить таблицу:
[a1],[b10]
[a2],[b10]
[a5],[b10]
[a8],[b10]
[c2],[b15]
[c4],[b15]
Пробовал посчитать максимальное количество запятых во всей таблице, создать столько же столбцов и в каждый столбец калькулировать нужные куски текста, а потом копировать строки N раз (в заивисмости от количества запятых в данной строке) и калькулировать туда значения из полученных столбцов, но быстро запутался... Понимаю, что намного проще написать несколько строк на питоне или VB, но опыта в этом не хватает.

Прошу помочь. Спасибо

Аватара пользователя
bingeomap
Гуру
Сообщения: 503
Зарегистрирован: 06 июл 2012, 08:37
Репутация: 53
Откуда: Азербайджан, Баку

Re: Таблица: как разделить одну строку на несколько строк

Сообщение bingeomap » 22 июл 2013, 15:25

Добрый день!
Этого можно решать в MS Exell. у вас есть это программа?
С уважением,
Биннат Халилов

JGBoBBy
Интересующийся
Сообщения: 17
Зарегистрирован: 03 июл 2008, 09:43
Репутация: 0

Re: Таблица: как разделить одну строку на несколько строк

Сообщение JGBoBBy » 22 июл 2013, 15:33

Да, конечно. А какой инструмент в excel решает такую задачу?

[ Сообщение с мобильного устройства ]

Аватара пользователя
bingeomap
Гуру
Сообщения: 503
Зарегистрирован: 06 июл 2012, 08:37
Репутация: 53
Откуда: Азербайджан, Баку

Re: Таблица: как разделить одну строку на несколько строк

Сообщение bingeomap » 22 июл 2013, 15:39

скопируйте данные в одном строке, нажимайте правую кнопку, откроется контекстное меню, там выйдет разные варианты вставки: выберите "Транспонировать". смотрите на рисунок:
Изображение
Получится вот так:
Изображение
С уважением,
Биннат Халилов

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Таблица: как разделить одну строку на несколько строк

Сообщение Александр Мурый » 22 июл 2013, 16:02

Вот питон-скрипт для решения задачи:

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


# -*- coding: utf-8 -*-

import sys
import csv

inf = csv.reader(open(sys.argv[1], 'rb'), delimiter = ' ')
outf = csv.writer(open(sys.argv[2], 'wb'), delimiter = ',')

l1 = []
l2 = []

for row in inf:
l1.append(row[0])
l2.append(row[1])

for t in zip(l1,l2):
s1 = t[0].split(',')
for s2 in s1:
rrow = (s2, t[1])
outf.writerow(rrow)


Скрипт принимает 2 аргумента — входной файл с разделителями и выходной CSV-файл.

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

python test.py infile.txt outfile.csv
Для простоты поля разделены здесь пробелом:
a1,a2,a5,a8 b10
c2,c4 b15
Выходной файл:
a1,b10
a2,b10
a5,b10
a8,b10
c2,b15
c4,b15
Редактор материалов, модератор форума

JGBoBBy
Интересующийся
Сообщения: 17
Зарегистрирован: 03 июл 2008, 09:43
Репутация: 0

Re: Таблица: как разделить одну строку на несколько строк

Сообщение JGBoBBy » 22 июл 2013, 17:01

Александр Мурый писал(а):Вот питон-скрипт для решения задачи:...
Александр, спасибо за ответ.

Правильно ли я понимаю, что данный скрипт обрабатывает таблицу только с двумя строками? А если таких строк миллион, как будет выглядеть данный скрипт?

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Таблица: как разделить одну строку на несколько строк

Сообщение Максим Дубинин » 22 июл 2013, 17:04

нет, неправильно понимаете
пристегивайтесь, турбулентность прямо по курсу

JGBoBBy
Интересующийся
Сообщения: 17
Зарегистрирован: 03 июл 2008, 09:43
Репутация: 0

Re: Таблица: как разделить одну строку на несколько строк

Сообщение JGBoBBy » 22 июл 2013, 17:06

Максим Дубинин писал(а):нет, неправильно понимаете.
А вот эти строки:
l1 = []
l2 = []
разве не об этом говорят?

Может я не очень корректно изложил суть задачи, приведя пример с двумя строками... Строк, конечно же, много...

Аватара пользователя
Максим Дубинин
MindingMyOwnBusiness
Сообщения: 9128
Зарегистрирован: 06 окт 2003, 20:20
Репутация: 747
Ваше звание: NextGIS
Откуда: Москва
Контактная информация:

Re: Таблица: как разделить одну строку на несколько строк

Сообщение Максим Дубинин » 22 июл 2013, 17:08

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

for row in inf:
говорит, для каждой строки во входном файле, нигде не указывается, что строки может быть только две.
пристегивайтесь, турбулентность прямо по курсу

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Таблица: как разделить одну строку на несколько строк

Сообщение Александр Мурый » 22 июл 2013, 17:14

Да, Максим прав.
Если возникают какие-то ошибки или не работает на других данных — пишите (желательно с примером этих данных).
Редактор материалов, модератор форума

JGBoBBy
Интересующийся
Сообщения: 17
Зарегистрирован: 03 июл 2008, 09:43
Репутация: 0

Re: Таблица: как разделить одну строку на несколько строк

Сообщение JGBoBBy » 22 июл 2013, 17:19

Александр Мурый писал(а):Да, Максим прав.
Если возникают какие-то ошибки или не работает на других данных — пишите (желательно с примером этих данных).
Вот конкретный пример (входной txt):
0100000100000000001 290,53,51,49,47
0100000100000000002 45,43,41,39,37
0100000100000000003 35,33,31,29,27
0100000100000000004 25,23,21,19,17
0100000100000000005 15,13,11,9,7,5
0100000100000000006 3,1,64,62,60,58
...

Скрипт не работает. Насколько я понимаю, по причине того, что перепутаны местами поля с запятыми и без.

Хотя такой тоже не работает:
290,53,51,49,47 0100000100000000001
45,43,41,39,37 0100000100000000002
35,33,31,29,27 0100000100000000003
25,23,21,19,17 0100000100000000004
15,13,11,9,7,5 0100000100000000005
3,1,64,62,60,58 0100000100000000006

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Таблица: как разделить одну строку на несколько строк

Сообщение Александр Мурый » 22 июл 2013, 17:27

Надо было поменять поля местами.

Заменяем строки

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

for row in inf:
    l1.append(row[0])
    l2.append(row[1])
на

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

for row in inf:
    l1.append(row[1])
    l2.append(row[0])
Работает:
290,0100000100000000001
53,0100000100000000001
51,0100000100000000001
49,0100000100000000001
47,0100000100000000001
45,0100000100000000002
43,0100000100000000002
Редактор материалов, модератор форума

JGBoBBy
Интересующийся
Сообщения: 17
Зарегистрирован: 03 июл 2008, 09:43
Репутация: 0

Re: Таблица: как разделить одну строку на несколько строк

Сообщение JGBoBBy » 22 июл 2013, 17:43

Александр Мурый писал(а):Надо было поменять поля местами.

Заменяем строки...
Ругаться перестал, но на выходе пустой csv. ЧТо не так?

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: Таблица: как разделить одну строку на несколько строк

Сообщение Александр Мурый » 22 июл 2013, 17:57

Проверьте, не пропущен ли пробел в качестве разделителя? В смысле, не вышло ли у вас '' вместо ' '.
Редактор материалов, модератор форума

JGBoBBy
Интересующийся
Сообщения: 17
Зарегистрирован: 03 июл 2008, 09:43
Репутация: 0

Re: Таблица: как разделить одну строку на несколько строк

Сообщение JGBoBBy » 22 июл 2013, 18:04

Александр Мурый писал(а):Проверьте, не пропущен ли пробел в качестве разделителя? В смысле, не вышло ли у вас '' вместо ' '.
Нет, я копировал Ваш код:

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

import sys
import csv

inpt = "C:\distr\doma1.txt"
outpt = "C:\distr\doma5.csv"

inf = csv.reader(open(inpt, 'rb'), delimiter = ' ')
outf = csv.writer(open(outpt, 'wb'), delimiter = ',')

l1 = []
l2 = []

for row in inf:
    l1.append(row[1])
    l2.append(row[0])

for t in zip(l1,l2):
    s1 = t[0].split(',')
    for s2 in s1:
        rrow = (s2, t[1])
        outf.writerow(rrow)

Ответить

Вернуться в «Общие вопросы»

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

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