powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (Perl) Замена в CSV файле
8 сообщений из 33, страница 2 из 2
(Perl) Замена в CSV файле
    #38457585
TheAthlete
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WarstoneПамять не зависит от размера файла.
Все зависит от реализации. Если написать
Код: ruby
1.
2.
my @lines = <FILE>;
for (@lines) {}


весь файл будет записан в @lines и при размере файла в 100 ГБ вся доступная оперативная память будет заполнена.

А в случае однострочника, действительно не будет зависеть от размера файла, т.к. будет производиться обработка построчно, без загрузки файла в память.

Что касается однострочников, то можно еще так:

$ cat 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

# не деструктивный, т.е. не меняет файл с записью в файл file_new.csv
$ less file.csv | perl -F, -naE 'say ",,$F[2],,$F[4],"' > file_new.csv

# деструктивный, с созданием резервной копии
$ perl -i.bak -pE 's/\w+,\w+,(\w+),\w+,(\w+),\w+/,,$1,,$2,/' file.csv
...
Рейтинг: 0 / 0
(Perl) Замена в CSV файле
    #38473473
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1Всем привет !


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

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

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

конечная строка
,,c,,e


perl -E 'for ( split /,/, "aa,bbbb,ccccc,dd,eeeeeeeeeee") { $tmp[$i++] = ( $i != 2 and $i != 4 )? "" : $_ } say join ",", @tmp'
...
Рейтинг: 0 / 0
(Perl) Замена в CSV файле
    #38473490
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle,


perl -aF/,/ -nE 'say ",,$F[2],,$F[4]"'
...
Рейтинг: 0 / 0
(Perl) Замена в CSV файле
    #38473735
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Testor1]vklesplit по разделителю полей. Если только разделитель не попадет внутрь поля.... Потом собрать из нужных полей строку.
Как вариант, регуляркой заменить ненужное на пустую строку.[/quot

Как регуляркой указать столбец ?

vkle сказал, что низзя, а вот МОЖНО:

perl -E 'say ",,", /([^,]*,*){3}/, ",", /([^,]*,*){5}/ for "aa,bbbb,ccccc,dd,eeeeeeeeeee"'

( проверять под Линухом, а под Виндусом двойные и одинарные кавычки надо поменять местами )
...
Рейтинг: 0 / 0
(Perl) Замена в CSV файле
    #38473746
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot volodin661]Testor1пропущено...


vkle сказал, что низзя, а вот МОЖНО:

perl -E 'say ",,", /([^,]*,*){3}/, ",", /([^,]*,*){5}/ for "aa,bbbb,ccccc,dd,eeeeeeeeeee"'

( проверять под Линухом, а под Виндусом двойные и одинарные кавычки надо поменять местами )

а можно и так:
$_="aa,bbbb,ccccc,dd,eeeeeeeeeee";
say "Третий: ", [m/[^,]*,*/g]->[2]';
say "Пятый: ", [m/[^,]*,*/g]->[4]';
...
Рейтинг: 0 / 0
(Perl) Замена в CSV файле
    #38474466
Testor1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
volodin661,

Спасибо за предложенные варианты.

Я не спец, но вопрос - краткость кода означает его производительность в данном конкретном случае ?
...
Рейтинг: 0 / 0
(Perl) Замена в CSV файле
    #38474752
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Testor1volodin661,

Спасибо за предложенные варианты.

Я не спец, но вопрос - краткость кода означает его производительность в данном конкретном случае ?


Краткость кода в случае приведенных примеров означает точное следование поставленной задачи с наложенной эстетикой программирования на Perl,
где, чем короче, тем круче ))

Ставить в прямое соответствие краткость кода производительности в случае механизма НеДетерминированных Конечных Автоматов( его использует механизм рег. выр. Perl) , я не решусь.

для проверки производительности можно, например, воспользоваться модулем Benchmark;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
(Perl) Замена в CSV файле
    #39002325
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как честный человек хочу сказать, что в PERL 6 регулярными выражениями эта задачка -

в CSV-строке выделить только 3-й и 5-й столбцы -

решается самым естественным с точки зрения человеческого(английского) языка образом:

Код: perl
1.
2.
3.
4.
5.
my $csv = '1A, 2+2B, 333, 44=44, (55;555), 666*666, 777E,888';

my @columns = $csv ~~ m:nth(3,5) / <-[,]> + /;

@columns.say;



output:
333 (55;555)



регулярные выражения в Perl6 вместе со всем прочим претерпели самые решительные изменения,
поэтому некоторые пояснения:

класс символов теперь представляется не квадратными скобками [ ... ], а вот так:
Код: php
1.
<[ ... ]>

,
a сами квадратные скобки служат для незахватывающей группировки.
угловые скобки - это assertion

Исключение из класса символов теперь не птичка ^ внутри квадр.скобок, а минус перед ними
Код: php
1.
<-[ ... ]>


метасимвол + остался служить квантификатором, пробелы являются незначащими по умолчанию.

Модификаторы переехали с конца на перед и перед ними ставится двоеточие.
Код: php
1.
m :i :g  /  ...   /


Код: php
1.
s:nth(3..5, 8) / (<-[,]>+) / "$0" /;  #закавычить в csv-строке столбцы с 3-го по 5-й и 8-ой



match -переменные $0,$1 итд отсчитываются теперь от 0 и, строго говоря, являются синтактическим сахаром;

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


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