in reply to Re: Open file & Strip comma delimiter
in thread Open file & Strip comma delimiter

Tachyon,
print"463694|BROOKS JR|JAMES|Arnold Markoe|1/17/03|MD Wkly Note|H:\17 +\00004DA5.0057\\00004DA5.005| 479309|WALDMAN|MELVI|Arnold Markoe|1/17/03|MD Wkly Note|H:\16\00004DE0 +.0056\\00004DE0.005|\n";
Why is printing for example "\\00004DA5.005|" the extra stuff. I only need $fields10..5|H:\<subdir>\<file.ext>' I'll appreciate your help I modified the code that you send me as follows:
print "#! perl -w use strict; my $infile = 'c:/doclist.chr'; my $outfile = 'c:/doclist.txt'; #use File::Find; #use File::Copy cp; open IN, "<$infile" or die "Couldn't open $infile, $!"; open OUT,">$outfile" or die "Couldn't open $outfile, $!"; ## print OUT join '|', split /,/ while <IN>; while(<IN>) { chomp; my @fields = split /,/; my $string1 = $fields[6]; do { warn "Empty field 7"; next } unless $string1; # this will keep the first 24 chars of string, throw out the rest a +nd # then append H:\ to it. # need \\ here or it won't compile my $string_header = $string1; substr($string_header,0,24) = 'H:'; # this will return :\ as we get 2 chars LEN from pos 25 my $string2 = substr($string1,26,2); # this will set $string3 to the last 13 chars of the string my $string3 = substr($string1,-13); my $finstring = $string_header.$string2.$string3; my $out = join '|', @fields[0..5], $finstring, "\n"; print OUT $out; } exit; \n";

Replies are listed 'Best First'.
Re: Re: Re: Open file & Strip comma delimiter
by tachyon (Chancellor) on Feb 17, 2003 at 02:42 UTC

    As I have tried to explain to you your use of substr is not going to do what you want. However we need to see

    1 the exact input data (comma separated)

    2 the exact output data (pipe delim) that you want to generate from 1

    If you are just trying to get rid of part of the file path you need to use a s/// regex or split $fields[6] on the '\', select the parts you want, join these bits back together with '/' and then join the whole thing with '|'.

    while(<IN>) { chomp; my @fields = split /,/; my $path_str = $fields[6]; do { warn "Empty field 7"; next } unless $path_str; my @path = split "\\", $path_str; # remove null fields if you really have \\ in there @path = grep { $_ } @path; # assuming you want to remove the 17 and 16 dirs in the example my $fixed_path = join "\\", @path[0,2,3] my $out = join '|', @fields[0..5], $fixed_path, "\n"; print OUT $out; }

    cheers

    tachyon

    s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

      I'm sorry but I'm burning the light here. I have a windows environment and split "\\" doesn't seem to work. I try or conditions but they don't work. Please help any ideas...

        After ten years it may suprise you that you have not discovered a mysterious bug. Split does work. On Windows. I am on Windows. Your code will be wrong. You don't show any. I have asked you to specify 1) this is data in 2) this is how I want it to come out three time now. Which bit is confusing you. You have not. I am tired of wasting my time on you. This works perfectly. Look. Listen. Learn.

        C:\>type test.pl my $line = 'C:\just\work\split\fine'; @data = split /\\/, $line; $new = join "\\", @data[0,3,2,4]; print "\nHad => $line\n", "Got => $new\n\n"; C:\>perl test.pl Had => C:\just\work\split\fine Got => C:\split\work\fine C:\>

        cheers

        tachyon

        s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print