2010-02-19 11 views
2

J'ai la ligne suivante dans un fichier CSV qui me donne des problèmes lors de l'analyse syntaxique:Comment bien analyser cette ligne avec FasterCSV?

312,'997639',' 2','John, Doe. "J.D." ',' ','2000 ',' ','Street ','City ','NY','99999','','2010-02-17 19:12:04','2010-02-17 19:12:04';

Je suis analyse avec les paramètres suivants:

FasterCSV.foreach(file, {:headers => true, :quote_char => '"', :col_sep => "','"}) do |row| 

Cependant, le vent souffle sur les lignes comme celui ci-dessus en raison de la "JD" à l'intérieur d'une colonne de ligne. Comment puis-je correctement analyser cette ligne avec FasterCSV?

Merci!

Répondre

0

Je n'ai pas été en mesure de se plier FasterCSV travailler la Comme j'en avais besoin avec ces données, le résultat final était simplement de demander un nouveau vidage des données avec une sortie CSV correcte. Merci pour les tentatives!

3

Il me semble que votre :quote_char devrait être ' et votre :col_sep devrait être ,. Dans ce cas:

FasterCSV.foreach(file, {:headers => true, :quote_char => "'", :col_sep => ','}) ... 
+0

Cela provoque une exception FasterCSV :: MalformedCSVError (FasterCSV :: MalformedCSVError) levée. – mwilliams

+1

Comment votre fichier CSV est-il généré? Es-tu certain que c'est bien formé? : quote_char spécifie le caractère qui entoure les champs, qui semble être une simple guillemets dans votre exemple, et: col_sep spécifie le caractère entre les champs, ce qui semble être une virgule dans votre exemple. C'est sur cette information que j'ai basé ma réponse. –

+0

Le problème est qu'il n'est pas bien formé et j'essayais de plier FasterCSV pour qu'il l'analyse de toute façon. Le vidage provenait d'un client et j'ai depuis envoyé la bonne requête SQL qui produira le bon CSV. En attendant, j'essaie toujours de le pirater. – mwilliams

1

Vous ne pouvez pas faire cela. FasterCSV n'autorise qu'un seul choix de caractère de citation et votre application en nécessite deux. Il n'y a pas moyen de faire des choses comme mignon passe dans un regex au lieu d'un personnage parce FasterCSV precompiles matchers avec le caractère de citation échappé comme suit:

# prebuild Regexps for faster parsing 
esc_col_sep = Regexp.escape(@col_sep) 
esc_row_sep = Regexp.escape(@row_sep) 
esc_quote = Regexp.escape(@quote_char) 
@parsers = { 
    :any_field  => Regexp.new("[^#{esc_col_sep}]+", 
           Regexp::MULTILINE, 
           @encoding), 
    :quoted_field => Regexp.new("^#{esc_quote}(.*)#{esc_quote}$", 
           Regexp::MULTILINE, 
           @encoding), 
    ... 
}