2014-12-15 5 views
-1

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

Sales-Date 
Item 
Sale Price 
Discount 
Cost of Item 
Profit (loss) 

Я уже помещал столбцы только в массив и удалял круглые скобки и тире. Это resulst в:

Sales Date 
Item 
Sale Price 
Discount 
Cost of Item 
Profit loss 

Так что мне нужно сделать, это придумать регулярное выражение, которое смотрит на линии, и если его только одно слово, возвращение говорят первые 4 буквы, и если его несколько слов, возвращается первая буква каждого слова. Идеально прописные. Таким образом, желаемые данные будут выглядеть так:

SD 
ITEM 
SP 
DISC 
COI 
PL 

Мне не повезло. Спасибо.

+2

раскол и зиЬзЬг должно помочь. – toolic

ответ

2

Что-то вроде этого, возможно:

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

while (<DATA>) { 
    chomp; 

    # If the line contains whitespace... 
    if (/\s/) { 
    # ... split the line into words ... 
    # ... take the first letter of each word ... 
    # ... join the letters together ... 
    # ... and upper-case the resulting string. 
    say uc join '', map { substr $_, 0, 1 } split /\s+/; 
    } else { 
    # ... otherwise, take the first four characters from the string ... 
    # ... and upper-case them. 
    say uc substr $_, 0, 4; 
    } 
} 

__END__ 
Sales Date 
Item 
Sale Price 
Discount 
Cost of Item 
Profit loss 
1

Возможное решение состоит в том, чтобы разделить линию на массив по пробелу, а не просто захватить каждую букву каждого слова. Что-то вроде:

my $line = "Sales Date"; 

# Split line into an array separated by whitespace 
my @words = split /\s+/, $line; 

my $letters; 
# For loop through number of words in array 
for (@words) { 
    m/(.)/; 
    $letters .= $1; 
} 

print $letters; 

Вышеупомянутое напечатает SD. Вы можете просто изменить m/(.) /, Чтобы представить количество символов, которые вы хотите захватить.

+0

Чтобы захватить больше символов, просто добавьте {x} после (.) В регулярное выражение. Конечно, вы могли бы также сделать это с помощью субстрата, как сказал инструмент: просто хватайте небольшую подстроку каждого слова и добавляйте их в конец букв. Однако у вас будет больше контроля над тем, что вы хватаете с помощью выражения соответствия. – Carlise

1
my @arr = map { 
    # make entire string upper case 
    local $_ = uc; 
    # remove trailing white-spaces (sometimes chomp fails on line endings) 
    s/\s+\z//; 

    # more words? 
    /\s/ 
     # take first letter of every word 
     ? join("", /\b(\w)/g) 
     # take first 1 to 4 letters (and be greedy at that) 
     : /(\w{1,4})/; 
} 
<DATA>; 

print $_, "\n" for @arr; 

__DATA__ 
Sales Date 
Item 
Sale Price 
Discount 
Cost of Item 
Profit loss 

выход

SD 
ITEM 
SP 
DISC 
COI 
PL 
+0

Спасибо, mpapec, что бы это сделать, как perl один вкладыш? – tman

+0

@ user2482575 try 'perl -lne '$ _ = uc; print/\ s /? join ("",/\ b (\ w)/g):/(\ w {1,4})/'файл ' –

+0

' s/(? | (?:^(\ S {1,4}) \ S * $) | (\ S) \ S * \ s *)/\ U $ 1/g' – bobbogo

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

  • Нет связанных вопросов^_^