Puis-je utiliser un fichier de commandes pour supprimer les colonnes vides dans un fichier .csv

3

Mon fichier .csv actuel contient neuf colonnes. Cependant, les deuxième et troisième colonnes sont vides et je souhaite les supprimer. Existe-t-il un moyen d'utiliser des commandes batch pour supprimer ces colonnes vides de mon fichier .csv ou exporter un nouveau fichier .csv sans ces colonnes vides?

batchnoober
la source
2
Veuillez modifier votre question pour confirmer: (1) Utilisez-vous Windows? (2) Dans l'affirmative, recherchez-vous une solution de traitement par lots Windows pur ou êtes-vous ouvert à d'autres solutions?
Gord Thompson

Réponses:

2

For /Fest capable d'analyser un fichier .csv. Sur une ligne, à exécuter directement à partir de l'invite de commande:

for /F "tokens=1,2,3* delims=," %i in (input.csv) do @echo %i,%l>>output.csv

Cela traverse ligne input.csv ligne par ligne et en utilisant une virgule comme séparateur, stocke la première valeur dans %i, la deuxième dans %j, la troisième dans %ket le reste de la chaîne (en utilisant un astérisque dans la liste des jetons) dans %l. En imprimant toutes les valeurs sauf les deuxième et troisième, vous les supprimez efficacement.

Toutefois, for /Fne compte pas les chaînes vides en tant que jetons. Par conséquent, la commande ne peut pas faire la différence entre deux virgules suivantes et une seule. Cette solution fonctionne si les colonnes vides ont un caractère d'espacement, mais peut sinon ignorer les mauvaises colonnes.

Pour contourner cette restriction, nous pouvons écrire un fichier de commandes qui utilise le remplacement de chaîne pour insérer un espace entre deux virgules. Ce remplacement est exécuté deux fois pour faire face à la possibilité de trois virgules. Les guillemets ^"!line!^"doivent indiquer qu'ils for /Fdoivent fonctionner sur une chaîne au lieu d'un fichier et sont protégés pour éviter !line!d'être évalués en tant que chaîne littérale plutôt qu'en tant que variable.

@echo off
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (input.csv) do (
    set line=%%a
    set line=!line:,,=, ,!
    set line=!line:,,=, ,!
    for /F "tokens=1,2,3* delims=," %%i in (^"!line!^") do (
        echo %%i,%%l>>output.csv
    )
)

Le résultat est un nouveau fichier .csv, identique à input.csv, à l'exception des deuxième et troisième colonnes omises.

Marcks Thomas
la source
Notez que cela ajoutera des blancs aux champs vides dans les colonnes autres que 2 et 3. Par exemple, The,quick,brown,fox,,,the,lazy,dogdeviendra The,,,fox, , ,the,lazy,dog.
Scott
3

Vous n'avez pas spécifié quel système d'exploitation. Si le vôtre vient avec cut, utilisez ceci.

cut -d',' -f1,4-9

-ddéfinit le délimiteur, dans ce cas sur a ,. La virgule n'étant pas un caractère spécial, vous pouvez omettre les guillemets.
-fsélectionne les champs, dans ce cas le champ 1 et les champs de 4 à 9 (en omettant les champs 2 et 3).

Fichier de test "example.cvs"
foo1,,, ba1, baz1, blah1, wibble1, wubble1
foo2,,, ba2, baz2, blah2, wibble2, wubble2
foo2,,, ba3, blah3, wibble3, wubble3
foo2,,, ba4, baz4, blah4, wibble4, wubble4

Un test réel de la commande:

> cut -d ',' -f1,4-9 example.cvs

foo1, ba1, baz1, blah1, wibble1, wubble1
foo2, ba2, baz2, blah2, wibble2, wubble2
foo2, ba3, blah3, wibble3, wubble3
foo2, ba4, baz4, blah4, wibble4, wubble4

Cut est livré préinstallé avec la plupart des systèmes d'exploitation (OS / X, distributions Linux, BSD, Solaris, etc.; à peu près tout le monde sauf DOS et Windows).

Si vous avez Windows, vous pouvez:

  1. Ouvrez le fichier CVS dans une feuille de calcul (par exemple, OpenOffice Calc ou MS Excel), supprimez deux colonnes, puis enregistrez le fichier. Difficile à automatiser, utilisez-le uniquement si vous devez le faire une fois ou rarement.
  2. ou téléchargez les outils Unix pour Windows et placez la cutcommande dans un fichier de commandes.
Hennes
la source
Mon système d'exploitation est Windows. Malheureusement, je souhaiterais que ce processus soit automatisé, car il s'agit d'un fichier .csv créé chaque jour dans le même format. Existe-t-il d'autres alternatives pour Windows OS?
batchnoober
Vous pouvez installer une commande cut (par exemple, à partir de gnuwin32.sourceforge.net/packages/coreutils.htm ) ou essayer quelque chose avec for. Un exemple d'utilisation de isfor /f "tokens=5 delims= " %i in (file.txt) DO echo %i
Hennes
Sauf si vous connaissez le nombre maximal de colonnes, utilisez-le -f1,4-pour inclure toutes les colonnes après la troisième. 4-des moyens 4-∞.
Scott
Vrai. Je me suis basé -f4-9sur la première phrase du message OP "" J'ai neuf colonnes ", mais il -f4-est plus flexible et moins typé. Une autre option aurait été d'utiliser sed.
Hennes
0

Je voudrais ouvrir le fichier CSV dans le Bloc-notes (ou n'importe quel éditeur de texte) et rechercher et remplacer ,,par ,. Ceci, bien sûr, suppose que les données de vos colonnes ne les contiennent ,,pas.

kobaltz
la source
3
Cela corrompra la structure du fichier si l'une des autres colonnes a des valeurs vides.
Gord Thompson
0

En supposant que vous soyez sur Windows, le fichier n’a pas d’en-tête et que Powershell est à votre disposition, vous pouvez utiliser les éléments suivants:

Import-Csv. \ InFile.csv -Header col1, col2, col3, col4, col5 -Délimiteur ',' | Objet-Sélection col1, col4, col5 | ConvertTo-Csv | Sélectionnez -skip 2>. \ OutFile.csv

Alors ça:

  • Importe le CSV.
  • Attribue des noms de colonne pour référence.
  • Sélectionne toutes les 5 colonnes, sauf 2 et 3.
  • Reconvertit en un fichier CSV.
  • Sélectionne ce fichier CSV en commençant à la ligne 2 (pour ignorer les en-têtes de colonne attribués)
  • Le transfère vers un fichier de sortie.
Ƭᴇcʜιᴇ007
la source