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";
}


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


Reply via email to