Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 08:01 14.05.24 
Компютри и Интернет
   >> Perl
Всички теми Следваща тема *Кратък преглед

Страници по тази тема: 1 | 2 | >> (покажи всички)
Тема Porskajete kak da stane tozi Regular Expression  
Авторricki (Нерегистриран)
Публикувано14.04.03 22:03



Kak moga da vzema opredelena stoinost ot string, koqto moje da bade ogradena s kavichki, a moje i da ne bade. Naprimer:

156,"1,234",567,845 ili 156,234,567,845

Polzvam sledniq regexp:

$input =~ /(.+),["](.+)["],(.+),(.+)/;

no kogato nqmam kavichki uslovieto se narushava i $1,$2,$3 i $4 sa prazni.



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: ricki]  
Авторusermod (Нерегистриран)
Публикувано14.04.03 23:45



ako tezi variables sa razdeleni s edin i susht symbol (kakto s zapetaiqta v sluchaiq), to udachno e da polzvash split. So:

my @array = split /,/, (1"2"3, 23, "3"2, "54");



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: usermod]  
Авторricki (Нерегистриран)
Публикувано15.04.03 03:02



Tam e problema, che ne moga da gi splitna, zashtoto shte se razvali chisloto mejdu kavichkite.

Misli si za CSV file - comma delimited Excel data, kadeto hilqdite se otdelqt sashto sas zapetaiki i za da nqma obarkvane Excel gi slaga v kavichki:

100, "1,100",120,"22,100"
101,4,345,50

neka $input ima stoinostta na vseki red, togava ako polzvam split(/,/,$input) parvia red shte e greshen, a vtoriq ne

($one, $two, $three, $four) = split(/,/,$input);

rezultata shte bade:
$one => 100
$two => "1
$three => 100"
$four => 120

koeto nqma da e vqrno, zashtoto na men mi trqbvat 100; 1,100; 120; 22,100

Zatova sega polzvam:
$input =~ /(.+),"(.+)","*(.+)"*,"(.+)"/;

no neznam zashto $4 e prazen, kogato $3 ima kavichki, ako $3 nqma kavichki vsichko si e OK.



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: ricki]  
Авторdarklord (Нерегистриран)
Публикувано15.04.03 23:29



Предлагам ти това решение:
# ако $x е това, което трябва да се преобразува:
$x = q(100, "1,100",120,"22,100") ;

$x =~ s/\"(\w+),(\w+)\"/\"$1:$2\"/g ;
$x =~ tr/,"/\t / ;
$x =~ s/:/,/g ;
@arr = split(/\t/, $x) ;



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: darklord]  
Авторricki (Нерегистриран)
Публикувано06.05.03 01:34



Благодаря за помоща,

Това последното е много добра идея, но не в този й вид, защото се ограничавам с краен брой запетайки, т.е. ако имам милион трябва да добавя, $3 и $4 за милярд, а една и съща колона може да имам различен брой запетайки. Не мога да знам предварително колко са запетайките.

Иначе това за \t ми хареса и в краина сметка накарах клиента да праща Tab-delimited файлове вместо CSV формат и проблемите със запетайките отпаднаха.



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: ricki]  
Авторedno momiche (Нерегистриран)
Публикувано06.05.03 17:06



kolko ti e goliam file-a?
az imah sashtia problem, sas exportant file ot access, comma delimited
stoinostite se slagat v kavichki samo ako samite te sadurjat zapetaika.. mnogo kofti, kato pri men osven cifri imashe i literals i drugi bozi

no moia file ne beshe ogromen, i az si reshih problema taka:

2 pass-a:
1) smeniam delimitera (v/u celia file)
2) formatiram ostanaloto kakto mi triabva

za 1) mojesh da polzvash primerno:

perl -pi -e 's/(".*?")*,/\1|/g;' mydataexportfile

(mojesh da imash prazna parva kletka)



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: ricki]  
Авторedno momiche (Нерегистриран)
Публикувано06.05.03 17:10



:)) chak sega go prochetoh..

ami, hubavo e che mojesh da nalagash formata. az niamah tazi vazmojnost..



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: edno momiche]  
Авторsas (Нерегистриран)
Публикувано07.05.03 16:48



DBD::CSV??



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: sas]  
Авторedno momiche (Нерегистриран)
Публикувано07.05.03 17:36



za moite celi izpolzvaneto na tozi modul ili podoben beshe absolutno bezmisleno, osven tova e bugav, ili pone beshe predi okolo 3 godini.

ot tova koeto beshe napisalo momcheto mislia che na nego mu triabva da parse-va celia file, a ne da runva query-ta s/u nego



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: ricki]  
Авторsas (Нерегистриран)
Публикувано07.05.03 20:24



http://rousse.pm.org/book/cookbook/ch01_16.htm
-quote-
From Mastering Regular Expressions.
sub parse_csv {
my $text = shift; # record containing comma-separated values
my @new = ();
push(@new, $+) while $text =~ m{
# the first part groups the phrase inside the quotes.
# see explanation of this pattern in MRE
"([^\"\\]*(?:\\.[^\"\\]*)*)",?
| ([^,]+),?
| ,
}gx;
push(@new, undef) if substr($text, -1,1) eq ',';
return @new; # list of values that were comma-separated
}
-quote-



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: ricki]  
Авторsofit (Нерегистриран)
Публикувано08.05.03 20:30



#!/usr/bin/perl -w
use strict;
$_ = '156,"15,234",567,845,156,234,567,845';
my @array = /((?:(?<=")(?:\d+,\d+)(?="))|(?:\d+)),?/g;

или

my @array = /((?<=")\d+,\d+(?=")|\d+)/g;

Ако горното те притеснява като сложност...

@array вече ще съдържа както следва следните елементи (подред от 0-6):
156
15,234
567
845
156
234
567
845

Не е най-доброто, което може да се измисли, но... Има и по-трудно нещо, което ми дойде първо като идея, но горното сякаш хем си върши работата хем е малко сложно и кефи;)

$str='1,"3,21",5,6,"12,41"';

while ($str)
{
($obj, $str) = popitem($str);
push(@ar, $obj);
}
print join("|", @ar);
sub popitem
{
my $in = shift;
my @out;
if ($in =~ m/^(\d+),(.*)/) { $out[0] = $1; $out[1] = $2; return @out; }
elsif ($in =~ m/^"(.+?)",(.*)/) { $out[0] = $1; $out[1] = $2; return @out; }
else { $in =~ s/"//g; $out[0] = $in; return @out; }
}

Надявам се, че това помогна...



Тема Re: Porskajete kak da stane tozi Regular Expressionнови [re: sofit]  
Авторricki (Нерегистриран)
Публикувано10.05.03 01:20



Супер !!!

Това последното е идеално, popitem е точно това, което ми трябваше. Работи идеално. Аз само малко го изминих да чете от и пише вав файл. Макар че ако веднаж си създал масива @ar, после можеш да правиш каквото си искаш със стойностите.

Например входен файл - input.csv:
1,"123,345",345,"324,232,234",12,"Kasf, sdf","121341,3451,13241,132414,213,421"
2,"1,230","784","234,456",23,"23","123,456,789,123","Abcd, dhjr kjh? Fkjha df,asdf,f fas, fa"
3,"1,230","784","234,456",23,"23"
4,"1,230","784"

open FILE, "input.csv" or die "Cannot open input file";
open OFILE, ">output.txt";

foreach $input (<FILE>) {
while ($input)
{
($obj, $input) = popitem($input);
push(@ar,$obj);
}
for ($i;$i<@ar;$i++){print OFILE $ar[$i]."|";}
print OFILE "\n";
}

print "Done\n";

sub popitem {
my $in = shift;
my @out;
if ($in =~ m/^(\d+),(.*)/) {
$out[0] = $1;
$out[1] = $2;
return @out;
} elsif ($in =~ m/^"(.+?)",(.*)/) {
$out[0] = $1;
$out[1] = $2;
return @out;
} else {
$in =~ s/"//g; $out[0] = $in;
return @out;
}
}

а изходеня файл - output.txt ще има следния вид:

1|123,345|345|324,232,234|12|Kasf, sdf|121341,3451,13241,132414,213,421|
2|1,230|784|234,456|23|23|123,456,789,123|Abcd, dhjr kjh? Fkjha df,asdf,f fas, fa|
3|1,230|784|234,456|23|23|
4|1,230|784|

Още веднаж, благодаря много за помоща!




Страници по тази тема: 1 | 2 | >> (покажи всички)
Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.