2009-11-11 2 views
2

, если у меня есть строка, сказать:В Perl, как я могу получить поля в этой строке CSV в массив без пробелов?

my $string = "A, B,C, D , E "; 

Как я могу поместить это в массив в Perl без ведущих и конечных пробелов? Так что я хочу только одну букву в каждом элементе массива. В настоящее время я занимаюсь этим:

my @groups = split /,\s*/, $string; 

Но этого, очевидно, недостаточно, поскольку конечные пробелы все еще существуют. Любая помощь оценивается. Большое спасибо !!

ответ

7

Затем разделите передние/конечные пробелы перед разбиением и сопоставьте ведущие/конечные пробелы в разделительном выражении.

my $string = " A, B,C, D , E "; 
$string =~ s/^\s+//; 
$string =~ s/\s+$//; 
my @groups = split /\s*,\s*/, $string; 

Использование модуля как Text::CSV, вероятно, лучше, чем пытаться сделать свой собственный CSV синтаксический, хотя.

+0

Drat. Побей меня. :-) – BlairHippo

+0

Этот faq говорит об обрезке ведущего/конечного пробела, поэтому я не уверен, на что вы хотите обратить внимание. – jamessan

+1

Если ваш вход гарантированно будет таким простым, люди, которые направили вас к Text :: CSV, верны: вы не хотите самостоятельно разбирать его. Если в данных есть какие-либо запятые, этот простой оператор split будет разбивать поля, которые он не должен. – BlairHippo

2

Здесь вы идете:

@groups = split /,/, $string; 
#remove whitespace now. 
@groups = map { s/^\s+//; s/\s+$//; $_ } @groups; 

Примечание: регулярное выражение может быть упрощено я уверен, просто не работал его еще.

+0

Ты действительно потрясающий! Это работало очень хорошо! Большое спасибо за помощь! – Juan

+0

s /// преобразует элементы в @groups, поэтому это бесполезное использование карты. Вы можете просто сделать: s/^ \ s + //, s/\ s + $ // для @groups; Или используйте Filter в Algorithm :: Loops. – runrig

5
my @groups = map { s!^\s+!!; s!\s+$!!; $_ } split /,/, $string; 

или

my @groups = $string =~ /([A-Z])/g; 

Однако, если входной сигнал не является на самом деле так просто, как вы показали, вы бы лучше использовать Text::CSV или Text::xSV.

+0

Почему вы используете! как разделитель q {}, из любопытства? –

+2

@Paul Nathan: Поскольку я очень раздражаюсь, что SO обрабатывает конечный символ '//' in 's/\ s + $ //' как символ комментария и вычеркивает остальную часть строки. –

+0

@ Синан: имеет смысл! Меня это тоже раздражает. –

1

Просто, чтобы убедиться, что я не хватает чего-то, после попытки прояснить ваши примеры, я пришел с этим:

my $string = " A, B,C, D , E "; 
$string =~ s/\s+//g; 
my @groups = split /,/, $string; 

бы работать как я думаю?

+2

Это удаляет ВСЕ пробелы, а не просто пробелы над запятыми и в начале/конце строки. Например, если у вас есть $ string = «Bob Jones, George Jetson, Foo Bar», тогда ваш код также разделяет пробелы между словами. – jamessan

2

Вам не нужно ограничивать себя split, вы просто используете совпадение с модификатором /g.

my $string = " A, B,C, D , E "; 
my @groups = $string =~ /\s*([^,]+?)\s*,?/g; 
Смежные вопросы