in reply to Re: converting txt to csv and formatting
in thread converting txt to csv and formatting

That would be perfect formatting just need to get it onto a csv file and read from the txt vs writing it. Changed it to read from the text file now I just need to have it print to the csv.
use warnings; use strict; my $infile="clients.txt"; open my $in, "<", $infile or die $!; open my $out, ">" , "clients.csv" or die $!; my $clients = print join ("\t\t" => qw(Name Phone E-mail)),$/; while (<$in>) { chomp; print $_, "\t"; print $/ if $. % 3 == 0; # note here }

Replies are listed 'Best First'.
Re^3: converting txt to csv and formatting
by 2teez (Vicar) on Jul 06, 2014 at 02:02 UTC

    ..just need to get it onto a csv file and read from the txt vs writing it. Changed it to read from the text file now I just need to have it print to the csv...

    That is exactly what you will have to do, at least I have shown you that it's not impossible to get each client data on a single row.

    And what do you hope to achieve with this line in your code?: my $clients = print join ("\t\t" => qw(Name Phone E-mail)),$/;

    If you tell me, I'll forget.
    If you show me, I'll remember.
    if you involve me, I'll understand.
    --- Author unknown to me

      I was trying to figure out how to print it to the output file and was hoping that would of made it easy but I was wrong. I modified it to this now:

      use warnings; use strict; my $infile="clients.txt"; open my $in, "<", $infile or die $!; open FH, ">" , "clients.csv" or die $!; print FH join ("," => qw(Name Phone E-mail)),$/; while (<$in>) { chomp; print FH $_, "\t"; print FH $/ if $. % 3 == 0; # note here }

      This gets the information into the csv file however I still need to modify the formatting, probably with a printf? What currently happens with this script is it creates the three columns "Name, Phone, Email" but the Name field is just the first name of the people while the Phone field gets EVERYTHING else. Would a simple printf or something solve this issue?

        I recommend you clearly separate the parsing of the input from the formatting and outputting of the CSV records. This is a more maintainable and less error-prone technique than inputting/parsing and formatting/outputting simultaneously. I also think using modular arithmetic with $. ($INPUT_LINE_NUMBER) is less clear than simply reading each trio of lines explicitly as AppleFritter demonstrated here.

        I also recommend you use autodie, explicitly specify the character encodings of the two text files, and explicitly close both file handles.

        use autodie qw( open close ); my $input_file = 'clients.txt'; my $output_file = 'clients.csv'; open my $input_fh, '<encoding(UTF-8)', $input_file; open my $output_fh, '>encoding(UTF-8)', $output_file; # Process the client data file... close $input_fh; close $output_fh; exit 0;