[JAVA] Importation CSV avec BOM

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!

Contexte

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!

problème

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!

Générer un fichier UTF-8 avec BOM

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.");
        }
    }

}

Importation de fichiers

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.");
        }
    }
}

Résumé

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

Importation CSV avec BOM
Importer JSON avec SolrJ
Importer des documents avec SolrJ
Conversion du fichier TSV en fichier CSV (avec BOM) en Ruby
Sortie de fichier csv avec csv ouvert
Vérifiez la valeur CSV avec RSpec
Sortie CSV par Apache Commons CSV
[Rails] Implémentation de la fonction d'importation CSV
Analyse CSV avec des caractères de saut de champ