1 votes

Déplacez des dossiers à l'aide du Terminal en faisant référence à un fichier CSV

Je dispose d'un fichier CSV contenant les deux colonnes suivantes :

  1. Colonne A : Depuis le répertoire (par exemple /Volumes/Backup Plus/Salesforce/Order Test/OR-1000049439).

  2. Colonne B : Vers le répertoire (par exemple /Volumes/Backup Plus/Salesforce/Opportunity Test/Q-DNYE20180508-2308).

J'ai besoin d'écrire un script dans Terminal qui parcourra le CSV et déplacera le répertoire de la colonne A dans le répertoire de la colonne B. Le résultat final serait que le dossier OR-1000049439 se trouve à l'intérieur du dossier Q-DNYE20180508-2308). Il y a environ 13 000 lignes où je dois effectuer cette opération.

Est-ce que quelqu'un pourrait m'aider sur la façon de procéder ?

Voici une copie des premières lignes du fichier CSV :

enter image description here

Je veux que le dossier en A2 se retrouve dans le dossier en B2. Je veux que le dossier en A3 se retrouve dans le dossier en B3, etc...

Brians-MacBook-Pro:Data Migration briangannuscio$ Head OrderFileV2.csv
/Volumes/Backup Plus/Salesforce/Order Test/OR-1000050081,/Volumes/Backup Plus/Salesforce/Opportunity Test/Q-RGORD20170207-1526

Brians-MacBook-Pro:Data Migration briangannuscio$ File OrderFileV2.csv
OrderFileV2.csv: ASCII text, with CR line terminators

2voto

Graham Miln Points 39606

Il existe de nombreuses façons d'aborder cette tâche. Ci-dessous, une approche utilisant le langage Go. Je m'attends à ce que d'autres proposent bientôt des outils et des langages alternatifs.

Si c'est une tâche ponctuelle, préparez-vous à passer du temps à accompagner le processus.

Si cela doit devenir une tâche automatisée régulière, prenez dès maintenant le temps de bien faire le script ou l'outil.

Choses à prendre en compte :

  • Appréciez que le format de fichier csv n'est pas entièrement normalisé.
  • Sachez qu'Excel a une réputation avec le format csv.
  • Est-ce qu'un nom de fichier ou de dossier contient une quote, un espace ou une virgule ?
  • Que se passe-t-il si des dossiers sont répertoriés mais manquent sur le disque ?
  • Que se passe-t-il si un dossier à déplacer est listé deux fois ?
  • Que se passe-t-il si un dossier à déplacer existe déjà à la destination ?

Sauvegardez vos données avant d'exécuter une quelconque commande.

csv-move

L'outil csv-move nécessite des fins de ligne UNIX/LF. La conversion des fins de ligne est un problème résolu ailleurs.

Des binaires prêts à l'emploi de csv-move sont disponibles dans la dernière version. Ci-dessous un extrait du code :

// Lire depuis stdin - attend des fins de ligne LF
r := csv.NewReader(os.Stdin)
r.FieldsPerRecord = 2

for {
    line, err := r.Read()
    // ...

    // Exécuter la commande
    cmd := exec.Command(mvPath, "-vn", line[0], line[1])
    if err := cmd.Run(); err != nil {
        log.Fatalf("échec du déplacement : %s", err.Error())
    }
}

Testez si votre fichier CSV peut être analysé comme deux entrées par ligne :

./csv-move < input.csv

Une fois testé, et si vous êtes satisfait des commandes de déplacement affichées, effectuez le déplacement :

./csv-move -move < input.csv

1voto

nohillside Points 82672

Niveau shell

while IFS=\, read -t $'\r' s t; do
    echo mv -n "$s" "$t/"
done < orderfile.csv

Retirez le echo une fois que vous êtes sûr du résultat.

Comme une petite sécurité contre les erreurs, je recommande de limiter un fichier CSV à environ 1000 lignes.

1voto

Michael Zhou Points 167

Vous devez vous attendre à ce que tout fichier csv doive être désinfecté avant de l'utiliser dans l'environnement shell. Au minimum, l'en-tête, s'il existe, doit être supprimé, tous les caractères de fin de ligne devront être convertis en LF (le caractère saut de ligne), et la dernière ligne du fichier csv devra être terminée.

La commande file montre que votre fichier csv a des lignes terminées par CR (retour chariot). Ainsi, en utilisant des commandes simples disponibles, vous pouvez convertir les caractères CR en caractères LF avec tr puis rediriger les résultats vers sed pour supprimer l'en-tête et terminer la dernière ligne, créant ainsi un nouveau fichier désinfecté.

tr '\r' '\n' < OrderFileV2.csv | sed '1d;a\' >sanitizedOrderFileV2.csv

Le nouveau fichier devrait être vérifié pour les lignes contiguës. Les champs et lignes vides doivent être supprimés. Vous devriez maintenant avoir un fichier que vous pouvez alimenter dans une boucle while read.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X