2017-06-20 3 views
1

J'ai une liste de fichiers déchargés d'instruments océanographiques. Pour une raison quelconque, il y a parfois un caractère non-ASCII inséré où un caractère ASCII devrait être. J'ai trouvé la tombe-E (È) où il devrait y avoir un W pour désigner l'hémisphère occidental dans les enregistrements de longitude.Bash/Linux Trouver un caractère non-ASCII dans un fichier .txt et le remplacer par un caractère ASCII

Voici ce que les données ressemble à:

CUMSECS Date UTC Time UTC Date Local Time local Z (m) Target Z Z Bot Temp PAR Salin Ang VelX Ang VelY Ang VelZ Pump + Pump - Gctr Fix secs Date UTC Time UTC Date Local Time Local Lat LatD Latm  Lon LonD Lonm  DOP Temp PAR Salin Batt V  CMD secs Date Local Time Local No. Cmds 
526068034 09/01/16 18:00:34 09/01/16 11:00:34  3.75 2.69  
3.75  0.29 0.000000 0.00 -12 -70 -50 0 5 10 
526068039 09/01/16 18:00:39 09/01/16 11:00:39  3.75 2.69  
3.75  0.29 0.000000 0.00 -12 -70 -50 0 5 10 
526068044 09/01/16 18:00:44 09/01/16 11:00:44  3.74 2.69  
3.75  0.29 0.000000 0.00 -12 -70 -50 0 5 10 
526068049 09/01/16 18:00:49 09/01/16 11:00:49  3.73 2.69  
3.75  0.29 0.000000 0.00 -30732 13588 31909 60399 7538 -82 
543622771 03/23/17 22:19:31 03/23/17 15:19:31 38.31877 38 
19.1262 N 123.07136 123 4.2812 È 23.6 115.06  0.0000 96.00 
121.718 
547764151 05/10/17 20:42:31 05/10/17 13:42:31  0.03 16.00 
127.00 13.68 1074.904320 33.56 -4908 -3976 261 1 0 0 
547764152 05/10/17 20:42:32 05/10/17 13:42:32  0.00 16.00 
127.00 13.68 1074.904320 33.56 -4908 -3976 261 1 0 0 

je peux trouver les caractères non-ASCII en utilisant la ligne Bash suivante pcregrep -n '[^\x00-\x7F]' 170510_ocean_Copepod.txt

Je voudrais faire une boucle à travers une série de fichiers, trouver ces les caractères, et les remplacer par un «W» afin que je puisse ensuite les lire dans R et les traiter en masse. Sinon, une solution de contournement à l'erreur retournée par R en essayant de lire ces fichiers ("chaîne multi-octets dans l'emplacement ...") serait tout aussi efficace pour mes fins. Toute aide très appréciée.

+2

Qu'avez-vous essayé jusqu'à présent? –

+0

'pcregrep -n '[^ \ x00- \ x7F]' 170510_ocean_Copepod.txt | sed 's/[^ \ x00- \ x7F]/W/g' 'mais cela renvoie une erreur sur l'appel sed pour une séquence d'octets illégale – SeaSpider

+0

Avez-vous essayé de changer l'argument' fileEncoding' de 'read.table'? – Scarabee

Répondre

1

Je pense que le problème est que È dans utf-8 est un caractère multi-octets composé de \xc3 et \x88 et sed ne semblent pas faire face à cela pour une raison quelconque. Comme suggéré @Jack, tr pourrait être un meilleur outil pour le travail (testé dans bash pour les fenêtres qui ne sont pas pcregrep):

[email protected]:~$ grep -P '[^\x00-\x7f]' | tr 'È' 'W' 
19.1262 N 123.07136 123 4.2812 WW 23.6 115.06  0.0000 96.00 

Notez qu'il ne convertit deux octets séparément W. Une autre méthode peut être de convertir le fichier entier en utilisant iconv. iso-8859-15 (latin-9) est un exemple d'encodage de caractères à un octet. La commande pour convertir le fichier en utilisant iconv serait:

iconv -f utf-8 -t iso-8859-15 -o <converted-file> <input-file> 
+1

Une autre option pourrait être d'utiliser 'iconv' pour convertir le codage du fichier avant de le lire dans' r' –

+0

On dirait que l'approche shell avec tr fonctionnera, mais je suis curieux de l'encodage aussi. Savez-vous quel encodage je pourrais convertir en qui ne contiendrait aucun caractère multi-octet et pourrait être ensuite lu dans R? Merci pour vos suggestions utiles. – SeaSpider

+0

On dirait que l'approche tr est aussi accrochée.Je reçois une erreur: 'tr: Séquence d'octets illégale' que l'on utilise' cat | tr 'È' 'W'' ou' pcregrep -n '[^ \ x00- \ x7F]' 170510_ocean_Copepod.txt | tr 'È' 'W''. Si j'utilise l'approche du chat, il imprime la ligne où se trouve le È avant de retourner l'erreur. – SeaSpider

0

Vous pouvez utiliser sed pour remplacer È avec W:

sed 's/È/W/g' 170510_ocean_Copepod.txt