2010-11-11 7 views
3

J'ai un fichier CSV que je totalise de deux façons: l'une utilisant Excel et l'autre utilisant awk. Voici les totaux de mes premières 8 colonnes dans Excel:Excel et awk en désaccord sur les totaux CSV

1) 2640502474.00 
2) 1272849386284.00 
3) 36785.00 
4) 
5) 107.00 
6) 239259.00 
7) 0.00 
8) 7418570893330.00 

Et voici ma awk sortie:

$ cat /home/jason/import.csv | awk -F "\"*,\"*" '{s+=$1} END {printf("%01.2f\n", s)}' 
2640502474.00 
$ cat /home/jason/import.csv | awk -F "\"*,\"*" '{s+=$2} END {printf("%01.2f\n", s)}' 
1272849386284.00 
$ cat /home/jason/import.csv | awk -F "\"*,\"*" '{s+=$8} END {printf("%01.2f\n", s)}' 
7411306364347.00 

Remarquez comment 1 et 2 correspondre exactement, mais 8 est désactivée par plusieurs millions. Je suppose que le total d'Excel est correct, alors pourquoi est-ce que awk gère ce fichier différemment?

Répondre

3

Vous avez probablement un nombre au format virgule entre guillemets. Excel traitera correctement ce nombre comme un seul champ. Votre regex pour la séparation de champs dans awk ne le fera pas - une virgule interne à un nombre est un séparateur valide selon cette regex. Il est très difficile (et surtout futile) d'essayer de gérer l'échappement imbriqué optionnel comme ce qui est possible dans csv avec une regex.

Comparez ce qui suit pour voir ce qui se passe probablement sur:

$ echo '"1","10","15","1,000","14"' | awk -F "\"*,\"*" '{print $4}' 
1 
$ echo '"1","10","15","1,000","14"' | awk -F "\",\"" '{print $4}' 
1,000 

Notez que la seconde regex ci-dessus a toujours un problème avec une fuite "dans le dernier champ et ne fonctionne que du tout si tous les champs sont toujours citation - c'est uniquement à des fins d'illustration

+0

Vous semblez avoir raison, je pense que j'essaierai ma solution d'une manière différente puisque le consensus semble être que 'awk' est mal adapté à CSV –

+0

Utilisez un langage qui a un module d'analyse de csv, par exemple Perl et Text :: CSV –

+0

GNU Awk 4 est en fait un peu mieux équipé pour traiter wi le CSV compliqué, mais Perl ou Python semblent toujours être des solutions mieux adaptées. – hemflit