Bonjour, c'est Misuda des ingénieurs. Cette fois, je décrirai que j'ai essayé d'écrire et de lire UTF-8 avec BOM par importation csv!
Lors du développement d'un système métier, je reçois une demande "Je veux créer des données!" Par lot. .. .. À ce moment-là, je pense d'abord à importer avec csv. La création d'une API coûte également le développement de l'autre partie.
** Le problème ici est de savoir comment éditer csv. ** ** Utilisez-vous * Microsoft Excel *? Après tout, c'est facile à modifier!
Lorsque vous envisagez d'utiliser * Microsoft Excel *, vous pouvez le modifier en créant un CSV avec Shift-JIS. Si le DB est UTF-8, il est nécessaire de convertir le code de caractère côté serveur. Lorsque cela se produit, c'est une bataille avec le code du personnage. Pour être honnête, je n'ai pas envie de gagner.
Dans un tel cas, s'il s'agit de UTF-8 avec BOM (byte order mark), il semble qu'il puisse être ouvert avec * Microsoft Excel * sans caractères déformés!
Cette fois, JAVA générera le fichier. Dans le cas de UTF-8, le début du fichier sera [0xEF 0xBB 0xBF].
import java.io.*;
import java.util.Arrays;
import java.util.List;
public class Main {
/**
*Créer un fichier CSV avec BOM (le code de caractère est UTF)-8)
*
* @param
* @return
*/
public static void main(String[] args) {
File file = new File("Chemin du fichier");
List header = Arrays.asList("pomme","Mandarine","banane","fraise","melon","Grain de raisin");
try(FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
PrintWriter writer = new PrintWriter(osw)){
//Subvention de nomenclature
fos.write(0xef);
fos.write(0xbb);
fos.write(0xbf);
header.forEach(c -> {
writer.print(c);
writer.print(",");
});
} catch (IOException e) {
System.out.println("Échec de la génération du fichier.");
}
}
}
Ce n'est pas grave si le fichier généré est définitivement UTF-8 avec BOM, mais parfois ce n'est pas le cas. Entrez le jugement et lisez.
import java.io.*;
import java.nio.charset.StandardCharsets;
import org.apache.commons.codec.binary.Hex;
public class Main {
/**
*Lire le fichier CSV avec la nomenclature (le code de caractère est UTF-8)
*
* @param
* @return
*/
public static void main(String[] args) {
File file = new File("Chemin du fichier");
try (FileInputStream fs = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fs, StandardCharsets.UTF_8);
LineNumberReader lnr = new LineNumberReader(isr)) {
//La première ligne
String row = lnr.readLine();
if (row != null && !row.isEmpty()) {
//Obtenez le premier personnage
String bom = row.substring(0, 1);
//Convertir le premier caractère en octet en caractère(Utiliser la classe Apache Commons Codec Hex)
String bomByte = new String(Hex.encodeHex(bom.getBytes()));
if ("efbbbf".equals(bomByte)) {
//Éliminer la nomenclature
row = row.substring(1);
}
System.out.println(row);
}
//Diviser les informations de la deuxième ligne
} catch (Exception e) {
System.out.println("Impossible de lire le fichier.");
}
}
}
MacOS et WindowsOS ont été ouverts dans * Microsoft Excel * et n'étaient pas déformés et pouvaient être modifiés! Après cela, je pense qu'il édite à l'aide d'un fichier texte. Je me demande s'il n'y a pas d'autre choix que de le soutenir.
Recommended Posts