Hello les gens,
J'aurais besoin de modifier un fichier csv pour y supprimer toutes les occurences du separateur ";"
J'aimerai autant que possible éviter de réinventer la roue s'il ya une api pour faire cela.
Merci pour toutes vos contribution.
Hello les gens,
J'aurais besoin de modifier un fichier csv pour y supprimer toutes les occurences du separateur ";"
J'aimerai autant que possible éviter de réinventer la roue s'il ya une api pour faire cela.
Merci pour toutes vos contribution.
En tout cas il n'y a rien de tel dans l'API Java standard, ni dans les bibliothèques que je connais.
Je pense n'échapperas pas à une lecture du fichier et réécriture dans un autre en ignorant les ";".
En shell script il y a sed. C'est pas du Java, mais c'est fait pour ça et ça évite de réinventer la roue.
En pratique ce n'est qu'une simple question de remplacement de regex (même moins que ça, en fait,) mais en Java je ne connais pas de bibliothèque pour faire ça sur un fichier.
Un truc que tu peux faire, c'est juste ouvrir un BufferedInputStream de ton fichier, lire les octets les uns après les autres, et réécrire dans un OutputStream d'un autre fichier, tout ce qui n'est pas égal à ';'
Puis effacer le fichier qui vient d'être lu, et renommer le fichier qui vient d'être écrit à sa place.
(Cette méthode ne marche que si l'encodage du fichier est un charset étendant l'ASCII mono-octet. Dans le cas contraire, il vaut mieux travailler sur un BufferedReader.)
A ma connaissance il n'y a pas une API java pour ton besoin.
Si tu peux juste remplacer le caractère ';' par un ' ' (espace) ou un caractère non imprimable alors :
NB:Comme l'a mentionné thelevin cette méthode n'est valable que si ton fichier utilise un encodage sur 8bits (ASCII, ISO latin 1...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 1-sauvegarder la position de ta lecture avec RandomAccessFile#getFilePointer() 2-Lire ton fichier par morceau avec read(byte[BUF_SIZE]) 3-Remplacer les ';' par ' ' 4- Ecrire ton buffer à la position sauvegardée 5- Revenir à l'étape 1 tant que non EOF.
A++
hmm... l'objet RandomAccessFile possède une méthode seek et mon fichier est constitué de champs de longueurs fixes, je pense pouvoir me débrouiller avec ??!?
- Je ne vois pas le rapport avec seek().
- utiliser un RandomAccessFile permet de modifier un fichier en lecture/écriture au lieu de lecture seule ou écriture seule, ce qui peut paraître bien... Mais là ce que tu veux c'est enlever des octets. À chaque fois que tu vas enlever un octet, tous les octets suivants vont devoir être décalés d'un vers la gauche.
De nos jours les OSs sont des supermans et gèrent ça très bien, mais ça reste extrêmement inefficace.
je pensais à quelque chose dans ces eaux là:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 RandomAccessFile raf = null; try { raf = new RandomAccessFile(XIMPORTFilePath, "rw"); String ligne; while ((ligne = raf.readLine()) != null) { //les ";" se situent toujours aux position '7' '24' et '222' par exemple raf.seek(7); raf.writeChars(""); raf.seek(24); raf.writeChars(""); raf.seek(222); raf.writeChars(""); //Comment passer à la ligne suivante ? } } catch (Exception e6) { // TODO Bloc catch auto-généré e6.printStackTrace(); } finally { raf.close(); }
Moi j'aurai fait un truc qui ressemble a ça:
a tester et corriger si nécessaire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStreamReader; public class Toto { // String oldpattern = ";"; // String replPattern = ""; public void readReplace(String fileName, String oldpattern, String replPattern){ String line; StringBuffer sb = new StringBuffer(); try { FileInputStream fis = new FileInputStream(fileName); BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); while ((line = reader.readLine()) != null) { line = line.replaceAll(oldpattern, replPattern); sb.append(line + "\n"); } reader.close(); BufferedWriter out = new BufferedWriter(new FileWriter(fileName)); out.write(sb.toString()); out.close(); } catch (Throwable e) { System.err.println("------------ exception" + e); } } }![]()
Ton code marche bien ctrl33, je remplacerai justequi n'est pas portable par
Code : Sélectionner tout - Visualiser dans une fenêtre à part "\n"
Code : Sélectionner tout - Visualiser dans une fenêtre à part System.getProperty("line.separator")
Attention, Excel différencie le "\n" (saut de ligne dans une valeur) de "\r\n" (nouvelle ligne de données)
Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
Ceylon : Installation - Concepts de base - Typage - Appels et arguments
ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
Une solution vous convient ? N'oubliez pas le tag
Signature par pitipoisson
Ce fichier n'est pas destiné à excel mais plutôt à Ciel. De ce fait, oui, il pourrait y avoir un problème. Ciel tourne sur un serveur windows et pourrait ne pas accepter le fichier généré avec des retours chariot type "\n" puisque généré sur une machine tournant sur unix.
Oui donc comme d'hab, il ne faut pas utiliser System.getProperty("line.separator").
Il faut utiliser la bonne convention de fin de ligne. Dans le cas présent, appremment "\r\n".
Partager