10
votes

Ignorer les lignes avec des valeurs vides lors de l'importation d'une application CSV dans Rails

J'ai une application où je permet aux utilisateurs d'importer des données CSV.

Tout fonctionne jusqu'à ce que les utilisateurs commençaient à importer des données avec des lignes vierges dans le fichier CSV. J'utilise ce qui suit pour saisir les lignes hors du fichier CSV: xxx

Je pensais que si j'étais ajouté la possibilité de skip_blanks que cela ne le ferait que mais il n'a pas . Des idées sur la façon dont je peux ignorer les rangées vierges.

merci!


6 commentaires

Êtes-vous sûr que les utilisateurs fournissent des lignes vides, les fichiers CSV pourraient être très drôles parfois


Veuillez essayer ce formulaire: CSV.New ((Open Import_File), En-têtes: True, Skip_blanks: True) .Readlines


@majioa je viens d'essayer cela mais a toujours des lignes vides. J'ai bouclé à travers le résultat et j'ai encore quatre rangées vides qui apparaissent comme ça, ",", "


Vous devriez éviter d'utiliser des objets de Ruby Io, sauf que vous êtes certain de le fermer, il est donc préférable que vous utilisiez plutôt .Open, les délégués à lire quels appels sont ouverts et appelle une nouvelle source de vue ici GITUB.COM/RUBY/RUBY/BLOB/...


@Grahamjackson Ces lignes ne sont pas vides "," est quatre valeurs séparées par des virgules


@Grahamjackson vient de poster un code de travail ci-dessous


5 Réponses :


10
votes

Ceci devrait fonctionner

CSV.open(import_file, skip_blanks: true, headers: true).reject { |row| row.to_hash.values.all?(&:nil?) }

CSV.readlines(import_file, skip_blanks: true, headers: true).reject { |row| row.to_hash.values.all?(&:nil?) }


8 commentaires

C'est une bonne réponse, mais existe-t-il de toute façon de faire la même chose, mais utilisez plutôt des readlines. (Je préférerais m'en tenir à cela parce que l'importateur de CSV dépend du format que les readlines fournissent les données de).


@Grahamjackson a mis à jour la réponse pour utiliser les readlines comme vous l'avez demandé, si cela fonctionne pouvez-vous uplifier et accepter la réponse?


Merci pour l'aide. Cela ne résout pas mon problème, mais je l'apprécie et je l'opposerai, car cela pourrait aider quelqu'un d'autre. Je dois supprimer les valeurs null mais je retourne toujours un objet CSV. Cette solution retournera un tableau.


@Grahamjackson laissez-moi modifier plus, vous avez donc vos objets CSV


Merci. La nouvelle solution que vous avez fournie fournit une collection d'objets CSV mais ne finit pas en supprimant les lignes avec des valeurs nulles.


@Grahamjackson bien avec mon test CSV Cela le supprimez, j'ai besoin d'attraper un peu de sommeil, j'espère avoir aidé :-)


OK, j'ai donc compris comment obtenir les résultats en tant que tableau d'objets CSV grâce à votre solution. Quelque chose comme ça: 'CSV.Readlines (Import_File, Skip_Blanks: True, en-tête: True) .Reject {| rangée | rangée.to_hash.values.all? (&: nil?)} '


Le bloc .reject peut-il être utilisé et renvoyer également un objet de tableau CSV :: Je joue avec cela et je retourne toujours un tableau.



10
votes

Ceci renvoie un objet CSV :: Table.

Csv.parse (importateur_file, en-tête: true, skip_blanks: true) .Delete_if {| rangée | rangée.to_hash.values.all? (&: vide?)}


1 commentaires

le vierge? était une belle solution pour moi, puis fonctionne pour "", "et Nil Row Data



0
votes

Si vous souhaitez également filtrer les colonnes qui incluent uniquement les blanchissures utilisent:

row.all? { |column| column.nil? || column.strip.empty? }


0 commentaires

0
votes

Voici comment j'ai géré Supprimer les lignes vierges de CSV:

table = CSV.parse(csv_text, headers: true)
table.delete_if { |row| row.to_hash.values.all?(&:blank?) }


0 commentaires

2
votes

La solution dépend si vous lisez le CSV avec ou sans en-têtes, et si vous souhaitez continuer à travailler avec un objet CSV :: Tableau code> ou si vous êtes satisfait d'un tableau de CSV :: rangée code>

sans en-tête, vous obtenez des lignes qui ressemblent à quelque chose comme: p> xxx pré>

avec des en-têtes: P>

table.delete_if { |row| row.to_hash.values.all?(&:nil?) }


0 commentaires