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


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

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

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

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

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

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

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

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

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

Мож на awk подойдет однострочник вроде такого?
Код: php
1.
awk -F, '{print ",,$3,,$5"}'
...
Рейтинг: 0 / 0
(Perl) Замена в CSV файле
    #38414274
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
(Perl) Замена в CSV файле
    #38418490
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
(Perl) Замена в CSV файле
    #38419538
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
S_Andrey_A,

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

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

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

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



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

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


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