Seems like a somewhat strange requirement. Presumably the application is dumb as a box of hammers and is quoting any internal *char type. Essentially you need to remember if a given field was quoted or not which is typically information that CSV parsers discard. You really need a specialised split that returns array refs for the fields where the first element is the field data and the second the quote status. Here is the basic idea:

#!/usr/bin/perl -w use strict; while( my $data = <DATA> ) { chomp($data); next unless $data; my $fields = get_fields( $data ); $fields->[rand(3)]->[0] = 'newval'; my $str = remap_fields( $fields ); print "$str\n"; } sub get_fields { [ map{ s/^"|"$//g ? [ $_, 1 ] : [ $_, 0 ] } split /(?<=\S),(?=\S)/ +, $_[0] ]; } sub remap_fields { join ',', map{ $_->[1] ? qq!"$_->[0]"! : $_->[0] } @{$_[0]}; } __DATA__ "hi",3,20.6,"green","32" 16,"alpha",0.00

The get_fields() function may or may not work for you. The logic it uses not to split on embedded commas is to only split on \S,\S, This is making the invalid assumption that embeded commas probably look, like, this ie have spaces. You may have no embedded commas or the assumption may be true. If it is not you will need a better parser.

cheers

tachyon


In reply to Re: Writing CSV files by tachyon
in thread Writing CSV files by EyeOpener

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.