2011-04-27 1 views
2

Lorsque je sauvegarde un fichier TSV dans Windows à partir d'Excel, il utilise la fin de ligne de \ r ou \ 015 (octal) qui apparaît dans vi comme^M. Lorsque je sauvegarde un fichier TSV sur Mac depuis Excel, il utilise la fin de ligne de \ r \ n ou \ 015 \ 012 (octal) qui apparaît dans vi comme^M.Comment modifier les terminaisons de fichier pour Windows ou un fichier mac sous Linux?

Comment puis-je gérer la modification des fins de ligne sur les deux fichiers sans ajouter de lignes vides supplémentaires tout en conservant les fins de ligne compatibles avec Linux?

J'utilise actuellement exec() en PHP pour exécuter les éléments suivants:

Si j'utilise:

cat {FILE} | tr -d "\015" > {NEW_FILE} 

ou

cat {FILE} | tr -d "\r" > {NEW_FILE} 

Works pour les fichiers Windows mais aussi des fichiers Mac échouent. (Supprime toutes les terminaisons de ligne)

Si j'utilise:

cat {FILE} | tr "\015" "\012" > {NEW_FILE} 

ou

cat {FILE} | tr "\r" "\n" > {NEW_FILE} 

Works pour les fichiers Mac, mais les fichiers Windows échouent. (crée des lignes vides)

Avez-vous des idées sur la façon de gérer l'une ou l'autre routine?

+0

Essayé ** sed **? 'sed -e 's/$/\ r /' unix-format.txt> win-format.txt' –

+0

Cela fonctionnera pour Windows, mais ne fonctionne pas pour Mac. J'ai besoin d'une solution qui fonctionnera pour chaque fichier. –

+0

Eh bien, vous pouvez essayer un script qui lit la première ligne + 1 char et voir si elle se termine par \ r ou \ r \ n, puis gérer en conséquence dans votre propre «code de convertisseur». Comme cela, vous pouvez vous en tenir à PHP pur et pas de dépendances de tiers. –

Répondre

1

Je pense avoir trouvé une solution élégante à ce problème. Dans mon script PHP, j'ai créé ce qui suit:

$results = exec("cd $directory; grep -Pl $'\r\n' $filename"); 
if($results == $filename) { 
    // Windows File (default) 
    exec("cd $directory; cat $filename | tr -d '\015' > $tmpfile; mv $tmpfile $filename");  
} else { 
    // MAC File 
    exec("cd $directory; cat $filename | tr '\r' '\n' > $tmpfile; mv $tmpfile $filename"); 
} 

Je suis ouvert aux améliorations si quelqu'un en a un.

0

dos2unix pour les fichiers windows et mac2unix pour les fichiers mac.

+0

Encore une fois ... Je n'ai pas accès à ces utilitaires sur le serveur. Ils ne sont pas installés et ne peuvent pas être. –

Questions connexes