in reply to Parsing csv without changing dimension of original file

I don't understand what you mean by "changing dimension" but I do see one problem with your code. $. is the line count on a given filehandle, reset each when you close the handle. Except you never close $fh, so your line count is not 1 for the first line of the second file (but 1 + the number of lines in the first file).

You should probably use distinct names for the two handles (eg: $dict_fh and $csv_fh).

Another way (not excluding the previous one) to correct your code is to properly close the handles when done using them. This can be done implicitly by limiting the life of the handle to a block, so that it is closed automatically on destruction. Using do, this can be done like this:

my %dict = do { open my $dict_fh, "<", $path or die "Couldn't open $path: $!"; map { chomp; split ' ', $_, 2 } <$dict_fh>; }; # $dict_fh doesn't exist here, so it is closed

Replies are listed 'Best First'.
Re^2: Parsing csv without changing dimension of original file
by Not_a_Number (Prior) on Mar 06, 2017 at 19:02 UTC

    I totally agree.

    But the only mention of $. in the OP code is the line

    next if $. < 2;

    Which suggests that the real problem is not in the line count but elsewhere.

    Also, what purpose does this line serve?

    use Text::CSV;

    Edit: The OP seems to have been silently updated while I was writing this. But I still don't understand the problem.

      Thank you very much for your reply. Here is the original code:

      use strict; use warnings; open my $fh, '<', 'kegg_pathway_title.txt' or die $!; my %dict = map { chomp; split ' ', $_, 2 } <$fh>; my $re = join '|', keys %dict; open $fh, '<', 'Orthogroups_3.csv' or die $!; while (<$fh>) { s/($re)/$dict{$1}/g; print; }

      I added the line

      next if $. < 2;

      because it giving me more column than the original csv. My original csv contains 13 columns. After replacing the content using dictionary it gives me many more column and couldn't load in R. You saw my previous code in loading the file in R. Is there anything I need to do to make it loadable in R. The 2nd column of the dict may contain multiple name. In the original csv the cells also contains single/multiple or no entry. Thanks again for helping me. Best Regards Zillur