Rob Dixon wrote:
> Stanislav Nedelchev wrote:
>>
>> Hi to all ,
>> I'm trying to make one script that analyzes some data from a file.
>> One guy from internet help me a lot .
>> Here is how data is organized .
>> Every row starts with skill_begin and it ends with skill_end.
>> between those 2 words there is field_name = some_data and etc.
>> Some rows has more field that other and sometimes there is no whitespace
>> between field_name=some_data. I want remove white spaces and tabs one or
>> more with only one tab and write it to file . Second this is most
>> difficult i want to find unique field and create SLQ create and insert
>> based on this data. But anyway we made it some how but we are still
>> working on it. I will be very happy if somebody can improve the script
>> or give me some advice how to do in in other way .
>> Here you can find example data.
>> http://rapidshare.com/files/21298750/skilldata.rar.html
>>
>> and here is the script i was try to make some remarks for some new in
>> Perl like I'm .
>>
>> if ( ! open OUT, ">outfile.txt")  { die "Cannot create outfile.txt: $!";}
>> if ( ! open OUT1, ">sqlstmt.txt") { die "Cannot create sqlstmt.txt: $!";}
>> if ( ! open IN, "skilldata.txt") { die "Cannot open skilldata.txt: $!";}
>> $var = "varchar(45)";
>> %hash = {};
>> while(<IN>)
>> {
>> s/\/\*.*\*\//\t/;                                #Remove Remarks
>> s/(\S+)\=(\S+)/$1 \= $2/g;                       #Add Whitespace
>> betwee = and data
>> for($i=1;$i<=$#a;$i=$i+3) {                      #Loop for generating
>> Create statesment
>>    if(!$hash{$a[$i]}) {                          #filing hash keys
>> from array key = "a"
>>      if($a[$i]!~/skill_end/){
>>         $hash{$a[$i]} = "a";
>>         $create = $create."," . "\n" .$a[$i]." ".$var;
>>      }
>>    }
>> }
>> $create =~s/^,//; #Remove , in the begining.
>> $stmt = "create table datafields($create)";
>> for($j=3;$j<=$#a;$j=$j+3){                        #Loop for Generate
>> insert statesment
>> $ins = $ins.","." "."\"".$a[$j]."\"";             #taking 3 position
>> value because data = value
>> }
>> $ins=~s/^,//;
>> $sql = "insert into datafields values($ins)";
>> if($sql =~/values\(\)/){} else {                  #if diffrent that
>> initial var then wtite to file
>>   print OUT1 "$sql\n";
>>   $ins = "";
>>   }
>> @a = split /\s+/, $_;                            #split input data  on
>> pieces based on whitespace.
>>   foreach $a(@a){                                #Loop
>>    @b = split/= /, $a;                           #split data on parts
>> by =
>>    #$b[0]=~s/ $//;                               #Removes empty space
>> on the beginning
>>    #$b[0]=~s/^ //;                               #Removes empty space
>> on the end
>>     if($b[0]!~/_begin|_end|\/\*|\*\//) {
>>         print OUT "$b[0]\t";                #Write Data without
>> skill_begin and skill_edn and add tabs delimeter.
>>     }
>>
>>   }
>> print OUT "\n";                             #Put new line on every row
>> }
>> print OUT1"\n\n$stmt\n\n";
> 
> Hi Stanislav.
> 
> What game would this be then? I'd like to know :)
> 
> I've rewritten your program to do what I think you want. I couldn't work
> out
> exactly what you wanted sent to outfile.txt so I've written just the SQL.
> All the data is held in the @data array so you can derive pretty much any
> output from it.
> 
> I added a field list to your insert statement as not all fields are present
> in each record so the list of values needs a corresponding list of column
> names.
> 
> You still have a problem though because, for instance, the 'effect'
> field of
> s_q_giants_scroll_1 is 881 characters long and won't fit into your
> 45-character varchar database fields.
> 
> I hope this helps.
> 
> Rob
> 
> 
> use strict;
> use warnings;
> 
> open OUT, '>sqlstmt.txt' or die "Cannot create sqlstmt.txt: $!";
> open IN,  'skilldata.txt' or die "Cannot open skilldata.txt: $!";
> 
> my $var = "varchar(45)";
> 
> my %columns;
> my @data;
> 
> while (<IN>) {
> 
> chomp;
> 
> s|/\*.*?\*/||g;
> 
> my %record;
> while (/(\S+)\s*=\s*(\S+)/g) {
>   $record{$1} = $2;
> }
> 
> push @data, \%record;
> }
> 
> foreach my $record (@data) {
> $columns{$_}++ foreach keys %$record;
> }
> 
> my $sql = sprintf "create table datacolumns(\n%s)",
>   join ",\n", map "  $_ $var", keys %columns;
> print OUT $sql, "\n\n";
> 
> foreach my $record (@data) {
> 
> $sql = sprintf "insert into datacolumns (\n%s)\nvalues(\n%s)",
>     join(",\n", map qq(  $_), keys %$record),
>     join(",\n", map qq(  "$_"), values %$record);
> print OUT $sql, "\n\n";
> }
> 
> Thanks a lot.
It's looks very short i must learn a lot of Perl i was thinking that
using hash will be better.I just looking for idea how to make the script
better if the script must be accurate it must even take length of data
and type like int or char or boolean and make field with appropriate
type. This is a skill data of Lineage 2 game. I was playing this game 1
year and now I'm quit.
I'm a real newbie in this perl matter i can't even realize why
I'm getting number of elements in array instead of list in this case
my @keys = split /=/, scalar @array;


P.S
Sorry for this stupid question but why i can't see my posts in this mail
list only post from other people ?

Thanks Again.


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to