Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Замена в CSV файле / 25 сообщений из 33, страница 1 из 2
01.10.2013, 16:10
    #38413283
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Всем привет !


Какой быстрый способ существует на PERL для замены значения столбцах CSV строки? Требуется значение всех столбцов заменить на пустую строку, кроме заранее определенных столбцов.

Пример
исходная строка
a,b,c,d,e

Требуется оставить значение 3 и 5 столбца.

конечная строка
,,c,,e
...
Рейтинг: 0 / 0
01.10.2013, 16:17
    #38413301
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
split по разделителю полей. Если только разделитель не попадет внутрь поля.... Потом собрать из нужных полей строку.
Как вариант, регуляркой заменить ненужное на пустую строку.
...
Рейтинг: 0 / 0
01.10.2013, 16:18
    #38413302
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
[quot vkle]split по разделителю полей. Если только разделитель не попадет внутрь поля.... Потом собрать из нужных полей строку.
Как вариант, регуляркой заменить ненужное на пустую строку.[/quot

Как регуляркой указать столбец ?
...
Рейтинг: 0 / 0
01.10.2013, 16:24
    #38413313
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Testor1Как регуляркой указать столбец ?Столбец явно - никак. Только на разделители ориентироваться.
...
Рейтинг: 0 / 0
01.10.2013, 16:33
    #38413328
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
vkleTestor1Как регуляркой указать столбец ?Столбец явно - никак. Только на разделители ориентироваться.

А что будет быстрее сплит или регулярка ?
...
Рейтинг: 0 / 0
02.10.2013, 07:53
    #38413795
FatalPerlError
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
split регулярки использует
...
Рейтинг: 0 / 0
02.10.2013, 10:07
    #38413883
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
FatalPerlErrorsplit регулярки использует

Тогда эффективнее писать цикл, который посимвольно анализирует строку на наличие разделителей и опеределяет номер столбца.
...
Рейтинг: 0 / 0
02.10.2013, 10:13
    #38413893
FatalPerlError
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Кстати, существует модуль Text::CSV
...
Рейтинг: 0 / 0
02.10.2013, 10:34
    #38413931
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
FatalPerlErrorКстати, существует модуль Text::CSV

Он входит в стандартную поставку при установке Perl на Sun машины? Если нет, то не смогу воспользоваться этим модулем
...
Рейтинг: 0 / 0
02.10.2013, 10:44
    #38413943
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Testor1,

У меня есть код на C# того, что мне нужно. Я там также использую посимвольный анализ. Perl плохо знаю и непривычно писать на нем.
...
Рейтинг: 0 / 0
02.10.2013, 11:07
    #38413993
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Testor1,

Мож на awk подойдет однострочник вроде такого?
Код: php
1.
awk -F, '{print ",,$3,,$5"}'
...
Рейтинг: 0 / 0
02.10.2013, 14:08
    #38414274
S_Andrey_A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Testor1Testor1,

У меня есть код на C# того, что мне нужно. Я там также использую посимвольный анализ. Perl плохо знаю и непривычно писать на нем.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
#!/usr/bin/perl
$in="a,b,csdsdsd,d00000,e,f";
@mask=(1,0,1,1,0,0);
map {$res.=$_ if $mask[$i++];$res.=","} split /,/, $in;
$res=~s/,$//;
print  $res;
------------------------------

a,,csdsdsd,d00000,,
...
Рейтинг: 0 / 0
07.10.2013, 09:37
    #38418490
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
S_Andrey_ATestor1Testor1,

У меня есть код на C# того, что мне нужно. Я там также использую посимвольный анализ. Perl плохо знаю и непривычно писать на нем.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
#!/usr/bin/perl
$in="a,b,csdsdsd,d00000,e,f";
@mask=(1,0,1,1,0,0);
map {$res.=$_ if $mask[$i++];$res.=","} split /,/, $in;
$res=~s/,$//;
print  $res;
------------------------------

a,,csdsdsd,d00000,,



Очень и очень не привычный стиль.

Пример активно использует регулярки, а значит будет снижение производительности.
...
Рейтинг: 0 / 0
07.10.2013, 23:22
    #38419538
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
S_Andrey_A,

Возможно ли в mask прописать id обязательных столбцов?
...
Рейтинг: 0 / 0
08.10.2013, 10:57
    #38419865
S_Andrey_A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Testor1,

массив mask это типа битовой маски 1- соответствующее поле оставляем, 0 - поле выключаем. Ну по идее можно переписать и указывать конкретные номера полей которые надо оставить.

На счет использования регулярок и производительности -наврядли это окажет какое то замедление. В принципе можно от них избавиться, но смысла в этом я не вижу(ИМХО)

ps: $res=~s/,$//; -- отрезаем финишную запятую.
...
Рейтинг: 0 / 0
10.10.2013, 11:08
    #38422581
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
S_Andrey_ATestor1,

массив mask это типа битовой маски 1- соответствующее поле оставляем, 0 - поле выключаем. Ну по идее можно переписать и указывать конкретные номера полей которые надо оставить.

На счет использования регулярок и производительности -наврядли это окажет какое то замедление. В принципе можно от них избавиться, но смысла в этом я не вижу(ИМХО)

ps: $res=~s/,$//; -- отрезаем финишную запятую.


Не могу понять в какую часть кода мне впихнуть регулярное выражения для обработки конкретного столбца.
Понимаю что в $_ часть нужной подстроки из выражения map {$res.=$_ if $i++~~@mask;$res.="|".$_}
Как $_ пропустить через регулярное выражения, чтобы сделать подмену ?
Мне нужно к слову 12 заменять на 23 только для выбранной подстроки


#!/usr/bin/perl

while($file_line=<STDIN>)
{
@mask=(0,4);
$i = 0;

for($file_line)
{
print $file_line;
map {$res.=$_ if $i++~~@mask;$res.="|".$_} split /\|/, $file_line;
$res=~s/\|$//;
print $res;

exit;
...
Рейтинг: 0 / 0
10.10.2013, 12:37
    #38422769
S_Andrey_A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Testor1,

s/pattern1/pattern2/ - заменяет шаболн1 на шаблон2 в переменной $_ - в любом месте.

в моем примере можно вот так

Код: coco
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#!/usr/bin/perl
use strict;
my $in="a,b,csdsdcd,d00000,e,f";
my @mask=(0,0,1,1,0,1);
my $res='';
my $i=0;
map { $res.=$_ if $mask[$i++];$res.=","} split /,/, $in;
$res=~s/,$//;
print  $res;

my $res='';
my $i=0;
print "\n";


map { s/c/KC/g; $mask[++$i]?$res.=$_:$res.=","} split /,/, $in;
$res=~s/,$//;
print  $res;


- в каждом поле заменит Ц на КЦ

ps: что значит $i++~~@mask; я хз _)
...
Рейтинг: 0 / 0
10.10.2013, 12:39
    #38422773
S_Andrey_A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Чучуть лишнего запостил...Хотя так тоже можно ... вот так все норм.

Код: ruby
1.
2.
3.
4.
5.
6.
7.
8.
9.
#!/usr/bin/perl
use strict;
my $in="c,b,csdsdcd,d00000,e,f";
my @mask=(1,0,1,1,0,1);
my $res='';
my $i=0;
map { s/c/KC/g; $res.=$_ if $mask[$i++];$res.=","} split /,/, $in;
$res=~s/,$//;
print  $res;
...
Рейтинг: 0 / 0
10.10.2013, 17:27
    #38423359
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
S_Andrey_AЧучуть лишнего запостил...Хотя так тоже можно ... вот так все норм.

Код: ruby
1.
2.
3.
4.
5.
6.
7.
8.
9.
#!/usr/bin/perl
use strict;
my $in="c,b,csdsdcd,d00000,e,f";
my @mask=(1,0,1,1,0,1);
my $res='';
my $i=0;
map { s/c/KC/g; $res.=$_ if $mask[$i++];$res.=","} split /,/, $in;
$res=~s/,$//;
print  $res;



не могу привыкнуть к коду перла.
когда нет присвоений и переменных.
...
Рейтинг: 0 / 0
31.10.2013, 15:07
    #38448457
TheAthlete
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Можно написать намного проще:

test.pl
Код: ruby
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#!/usr/bin/perl -w
use strict;
use warnings;

use Tie::Array::CSV;

## Осторожно!!!! Меняя массив @file вы меняете файл
tie my @file, 'Tie::Array::CSV', 'file.csv';

@$_[0,1,2,4] = '' for @file; # удалить значения в позициях 0, 1, 2, 4
#@$_[0..5] = qw/a b c d e f/ for @file; # заполнить файл значениями



file.csv
a,b,c,d,e,f
a,b,c,d,e,f
a,b,c,d,e,f
a,b,c,d,e,f
...
Рейтинг: 0 / 0
31.10.2013, 15:21
    #38448502
Testor1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
TheAthleteМожно написать намного проще:

test.pl
Код: ruby
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#!/usr/bin/perl -w
use strict;
use warnings;

use Tie::Array::CSV;

## Осторожно!!!! Меняя массив @file вы меняете файл
tie my @file, 'Tie::Array::CSV', 'file.csv';

@$_[0,1,2,4] = '' for @file; # удалить значения в позициях 0, 1, 2, 4
#@$_[0..5] = qw/a b c d e f/ for @file; # заполнить файл значениями



file.csv
a,b,c,d,e,f
a,b,c,d,e,f
a,b,c,d,e,f
a,b,c,d,e,f

а что с производительностью ?
...
Рейтинг: 0 / 0
31.10.2013, 15:25
    #38448507
TheAthlete
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Testor1S_Andrey_AЧучуть лишнего запостил...Хотя так тоже можно ... вот так все норм.

Код: ruby
1.
2.
3.
4.
5.
6.
7.
8.
9.
#!/usr/bin/perl
use strict;
my $in="c,b,csdsdcd,d00000,e,f";
my @mask=(1,0,1,1,0,1);
my $res='';
my $i=0;
map { s/c/KC/g; $res.=$_ if $mask[$i++];$res.=","} split /,/, $in;
$res=~s/,$//;
print  $res;



не могу привыкнуть к коду перла.
когда нет присвоений и переменных.

Здесь нет ничего сложного:
my $in="c,b,csdsdcd,d00000,e,f"; # определяется скаляр (единичное значение, поэтому $ вначале) с нужным значением
my @mask=(1,0,1,1,0,1); # определяется массив (множественное значение, поэтому @ вначале) с нужными значениями
Насчет переменных $res и $i думаю понятно

map здесь работает в void-контексте, т.е. массив, который он обычно возвращает либо в переменную либо в функцию, по-сути никуда не возвращается. Его в случае необходимости можно легко заменить на for или while, например так:

Код: ruby
1.
2.
3.
4.
5.
for (split /,/, $in) {
  s/c/KC/g; 
  $res .= $_ if $mask[$i++];
  $res .= ","
}



$res=~s/,$//; # удаляет последнюю запятую с помощью оператора s/// из переменной $res
...
Рейтинг: 0 / 0
31.10.2013, 15:37
    #38448535
TheAthlete
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Testor1а что с производительностью ?
все зависит от размера файла. Если очень большой, то очень неплохая, это касается памяти.
Использование Tie::Array::CSV гораздо медленнее, чем загрузка всех данных в память с последующей обработкой (например, с помощью my @lines = <FILE>), но зато оно лучше подходит для очень больших файлов, которые не могут одновременно находиться в памяти.
...
Рейтинг: 0 / 0
06.11.2013, 17:24
    #38454910
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Код: php
1.
echo "1, 2, 3" | perl -ne 'my @mask=(1, 0, 1); print join(", ", map{ shift(@mask) ? $_ : "" } split(/\s*,\s*/, $_))'



Память не зависит от размера файла. Можно чуть быстрее, ценой увеличения длинны отднострочника и этот однострочник подвержен запятым в кавычках в поле.
...
Рейтинг: 0 / 0
06.11.2013, 17:26
    #38454914
Warstone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(Perl) Замена в CSV файле
Код: php
1.
echo "1, 2, 3" | perl -ne 'chomp; @mask=(1, 0, 1); print join(", ", map{ shift(@mask) ? $_ : "" } split(/\s*,\s*/, $_)) . "\n"'

Так более правильней.
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Замена в CSV файле / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]