in reply to Converting File Delimiters

As a one-liner using App::CCSV:
perl -MApp::CCSV -ne "$csv->sep_char('|'); csay @f; $csv->sep_char(',' +)" <comma.csv >pipe.CSV

CountZero

A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

My blog: Imperial Deltronics

Replies are listed 'Best First'.
Re^2: Converting File Delimiters
by mmueller44 (Novice) on Aug 09, 2012 at 22:17 UTC

    I'm getting an error running the code below

    perl -MApp::CCSV -ne "$csv->sep_char('|'); csay @f; $csv->sep_char(','+)" <aaa.txt >pipe.txt

    syntax error at -e line 1, at EOF Execution of -e aborted due to compilation errors.

    I think it has something to do with the double quotes

      I think it has something to do with the double quotes

      Yes, and with your shell. As a rule of thumb, you need to quote one-liners with double quotes on Windows, and with single quotes on Unix systems including Linux, *BSD, Mac OS X and the cygwin shell.

      If you use double quotes on Unix, the shell interpolates the quoted string, and because you rarely have an environment variable named "csv", each "$csv" is replaced with an empty string.

      This does not happen on Windows with command.com and cmd.exe, because their quoting rules are, um, different. Strange may be a better word, bug-compatible back to MS-DOS 1.0 describes what actually happens.

      And don't forget that Windows does not expand wildcards for you. This is not a problem with this one-liner, but often you want to use Win32::Autoglob:

      X:\>perl -E "say for @ARGV" *.exe *.exe X:\>perl -MWin32::Autoglob -E "say for @ARGV" *.exe cksum.exe cp.exe cut.exe date.exe sort.exe sum.exe X:\>

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)