CSV to Json

65 views
Skip to first unread message

kstubs

unread,
Aug 18, 2011, 11:24:47 PM8/18/11
to prototype-s...@googlegroups.com
Any tips for converting CSV to Json?  I have CSV, row deliminted \n, and fields delimited with typical comma.  There is a known/exisiting object type for each field.  Something like:

{'fields': [{'field':'fname', 'col':2}, {'field':'ssn', 'col':5}]}

So I have that to work from, and will populate a Json result like this:
[{'data':{'fname':value}, {'ssn':value}},{'data':{'fname':value}, {'ssn':value}}]

I feel like I am doing it the long way when I:

// split csv string by \n to new line array

// for every item in new line split string

// split item by , to field array

// for every item in field array

// create object to add to new data array

Any ideas would help.

Thanks,
Karl..

Jason

unread,
Aug 20, 2011, 12:03:22 PM8/20/11
to Prototype & script.aculo.us

I would use a small PHP script (assuming the first line is the field
names)

$fields = array();
$data = array();
$fh = fopen($filename);
$line = fgetcsv($fh);
foreach($line as $n)
{
$fields[] = $n;
}

while($line = fgetcsv($fh) !== false)
{
foreach($line as $key => $n)
{
$data[$fields[$key]][] = $n;
}
}

print json_encode($data);


see http://us.php.net/fgetcsv for more examples

kstubs

unread,
Aug 21, 2011, 4:55:05 PM8/21/11
to prototype-s...@googlegroups.com
Client side only.. I have something written but not sure I'm taking advantage of prototype added methods for arrays and enumerations.  Basically, I'm constructing a csv from json object iterating over it's data array, and appending to CSV like:  

csv+=data
csv+=','
csv+='\n'

The above is *obviously* chopped significantly and missing the smarts around when to add , and when to add \n..

Victor

unread,
Aug 22, 2011, 6:13:46 AM8/22/11
to prototype-s...@googlegroups.com
You can invert your {'fields': [{'field':'fname', 'col':2}, {'field':'ssn', 'col':5}]} to something like ['field0', 'field1', 'fname', 'field3', 'field4', 'ssn'] and then zip it (Enumerable#zip) with every CSV row.

Eric

unread,
Aug 22, 2011, 8:01:41 AM8/22/11
to Prototype & script.aculo.us
Jason,

Why do you copy the return array into an other one before using it?
(and why rewriting code already available as native PHP functions?)

This should do the same than your code:
$fh = fopen($filename);
$fields = fgetcsv($fh);
while($line = fgetcsv($fh) !== false)
{
print json_encode(array_combine($fields,$line));
}
fclose($fh);

Eric

PS: You may want to add some error handling :o)


On Aug 20, 6:03 pm, Jason <jwestbr...@gmail.com> wrote:
> I would use a small PHP script (assuming the first line is the field
> names)
>
> $fields = array();
> $data = array();
> $fh = fopen($filename);
> $line = fgetcsv($fh);
> foreach($line as $n)
> {
> $fields[] = $n;
>
> }
>
> while($line = fgetcsv($fh) !== false)
> {
> foreach($line as $key => $n)
> {
> $data[$fields[$key]][] = $n;
>
> }
> }
>
> print json_encode($data);
>
> seehttp://us.php.net/fgetcsvfor more examples

Jason

unread,
Aug 22, 2011, 5:05:20 PM8/22/11
to Prototype & script.aculo.us

Eric - that is smoother, I'll update my scripts to run it that way


thanks!
> > seehttp://us.php.net/fgetcsvformore examples
Reply all
Reply to author
Forward
0 new messages