[identity profile] one-wanna-live.livejournal.com posting in [community profile] useful_faq
Добрый день,

Подскажите, пожалуйста, советом.

Есть серия данных, записанная в текстовом докуменет, в виде:
1 2
3 4.5
5 6
-7.1 8
9 10
11 -12

Другими словами в каждой строке по два значения, среди которых могут быть отрицательные и дробные, разделены они либо пробелом, либо последовательностью пробелов.
Как этой серии придать форму:

d1.push ([1, 2]);
d1.push ([3, 4.5]);

и т.д.?

Date: 2012-06-08 09:02 am (UTC)
From: [identity profile] langsamer.livejournal.com
Операционная система у вас какая?
Для винды будет проще всего, имхо, открыть этот документ в Экселе, используя как разделитель пробел (предварительно в любом текстовом редакторе заменив итеративно 2 пробела на один). После чего в третьей колонке сделать формулу типа = d1.push ([A1, B1]};

Для никсов: sed или awp, что вам больше нравится.

Date: 2012-06-08 09:16 am (UTC)
From: [identity profile] langsamer.livejournal.com
Ну вот вам точная формула:
=CONCATENATE("d1.push([";A1;",";B1;"])")
Вставьте в первую строку третьей колонки, потом заполните вниз, потянув вниз мышкой за выделенный угол этой ячейки.

Date: 2012-06-08 09:02 am (UTC)
From: [identity profile] blood-again.livejournal.com
На строки проще разбить без регулярного - explode или аналогом.
Каждую строку разобрать выражением /\s*(\S+)\s+(\S+)\s*/

UPD: если задача не является учебной типа "использовать регулярные выражения для...", то большинство языков позволяют такие данные из файла считать стандартными функциями и регулярки здесь не нужны :)
Edited Date: 2012-06-08 09:07 am (UTC)

Date: 2012-06-08 09:21 am (UTC)
From: [identity profile] blood-again.livejournal.com
Если каким угодно образом чтобы потом копировать в код, проще через электронную таблицу, как предложил выше ув. [livejournal.com profile] langsamer.

explode - это функция в ряде языков, позволяющая разбивать строку на подстроки по указанному разделителю.

Date: 2012-06-08 09:15 am (UTC)
From: [identity profile] fox-12.livejournal.com
Навскидку:
$ cat 1.txt
1 2
3 4.5
5 6
-7.1 8
9 10
11 -12
$ cat 1.txt | awk '{ print "d1.push([",$1,",",$2,"]);"; }'
d1.push([ 1 , 2 ]);
d1.push([ 3 , 4.5 ]);
d1.push([ 5 , 6 ]);
d1.push([ -7.1 , 8 ]);
d1.push([ 9 , 10 ]);
d1.push([ 11 , -12 ]);

Edited Date: 2012-06-08 09:16 am (UTC)

Date: 2012-06-08 09:21 am (UTC)
From: [identity profile] fox-12.livejournal.com
Вначале я просто вывожу исходные данные.
Затем исходные данные из файла я перенаправляю утилите awk, которая берет первое и второе число в строке, и дописывает нужные строковые данные.

Date: 2012-06-08 10:59 am (UTC)
From: [identity profile] potan.livejournal.com
Под винды awk проще всего взять из пакета cygwin.
В других системах она сразу есть.

Date: 2012-06-08 09:15 am (UTC)
From: [identity profile] robinbobin.livejournal.com
split(" ", str);

Date: 2012-06-08 09:22 am (UTC)
From: [identity profile] robinbobin.livejournal.com
вот готовый скрипт на php

$a = file ("text.txt");
foreach ($a as $k=>$v) {
list ($d1, $d2) = split (' ', $v);
echo "d1.push ([$d1, $d2]);\n";
}

Date: 2012-06-08 10:55 am (UTC)
From: [identity profile] larikov.livejournal.com
Ваше решение не соответствует условию задачи.
Данный файл оно обработает неверно
1         2
4  5
6 7

Date: 2012-06-08 10:57 am (UTC)
From: [identity profile] potan.livejournal.com
perl -ne 'chomp; tr/ /,/; print "d1.push([$_]);\n"' outfile

Date: 2012-06-11 08:33 pm (UTC)
From: [identity profile] http://users.livejournal.com/_the_hedgehog_/
winword
Ctrl+h; Найти:" ";Заменить:" " (без кавычек) нажимать кнопку "Заменить все" пока не станет писать "Произведено замен: 0"
Найти:"^p";Заменить:"]);^pd1.push ([" (без кавычек) нажать кнопку "Заменить все" один раз
допилить первую и последнюю строку