2014-02-07 2 views
0

Мне нужно получить только название этих песен из текстового файла, который имеет всю свою информацию. Текстовый файл выглядит следующим образом.Изменить элемент в массиве. Удаление части элемента в массиве. Perl

TRMMCAU128F9332597<SEP>SOEEWIZ12AB0182B09<SEP>YGGDRASIL<SEP>Beyond the Borders of Sanity 
TRMMCCS12903CBEA4A<SEP>SOARHKB12AB0189EEA<SEP>Illegal Substance<SEP>Microphone Check 

Так название было бы «за пределами Sanity» и «Микрофон Check»

Я не могу понять, как удалить все, что материал перед ним. Вот код, я до сих пор:

# Checks for the argument, fail if none given 
if(songs.txt != 0) { 
print STDERR "You must specify the file name as the argument.\n"; 
exit 4; 
} 

# Opens the file and assign it to handle INFILE 
open(INFILE, 'songs.txt') or die "Cannot open songs.txt: $!.\n"; 

@data = <INFILE>; 

my @lines = map {$_ =~ /^T/ ? ($_ => 1) :()} @data; 

# This loops through each line of the file 
#while($line = <INFILE>) { 

#chomp; 
# print $line; 
# print @data; 

#} 

# Close the file handle 
close INFILE; 
print @lines; 

Он выводит это:

1TRMMCAU128F9332597<SEP>SOEEWIZ12AB0182B09<SEP>YGGDRASIL<SEP>Beyond the Borders of Sanity1 

Я понимаю, Dont 1 в ничего я просто играл с ним. Любая помощь приветствуется. Благодарю.

+1

Поскольку странный текст, который предшествует требуемым данным, имеет переменную длину, вам нужно будет объяснить правила, необходимые для распознавания конца этого текста. Остальное будет легко. – Gene

+0

Вы должны сообщить нам, как вы знаете, где заканчивается «материал» и начинается название песни. – toolic

+1

Действительно ли '' буквально в файле или это ваша мета-нотация для какого-либо другого разделителя? –

ответ

4

Используйте split функцию

@songs = map { chomp; (split /<SEP>/)[3] } @data; 

Допуская <SEP> буквально в файле, и вы хотите, четвертые разделители поля, как это видно из данных образцов.

1

Ваши данные выглядят как данные из Million Song Dataset, который использует литерал <SEP> в качестве разделителя полей. Чтобы получить последнее поле - название песни - вы можете сделать следующее:

use strict; 
use warnings; 

@ARGV or die "You must specify the file name as the argument.\n"; 

while (<>) { 
    print $1 if /([^>]+)$/; 
} 

Использование: perl script.pl songs.txt [>outFile.txt]

Последний, необязательный параметр направляет вывод в файл.

Вывод на наборе данных:

Beyond the Borders of Sanity 
Microphone Check 

Регулярное выражение соответствует всем символам от конца строки, которые не >, и захватывает их. Если совпадение будет успешным, будет напечатан захват (сохраненный в $1).

Надеюсь, это поможет!

+0

Это не удается, если во входной записи имеется более четырех полей (т. Е. Есть имя «» и больше данных после названия песни). –

+1

@JimGarrison - Действительно, это было бы, но нет никаких данных в репрезентативных данных OP более чем из четырех полей. 'split'ting также может быть проблемой, если поле было добавлено к началу в более поздних данных. – Kenosis

Смежные вопросы