|
Страници по тази тема: 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 | >> (покажи всички)
|
|
|