Comment exécuter la commande de copie Postgresql avec des informations de colonne sur Java

introduction

Je pense que c'est un sujet trop précis et faible, mais je l'ai écrit.

La commande de copie PostgreSQL est Vous pouvez traiter à grande vitesse lors du stockage du fichier dans la table. Cependant, bien que le CSV puisse être enregistré tel quel, Si vous souhaitez compléter la valeur

  1. Lisez le fichier CSV.
  2. Créez un fichier CSV avec des colonnes.
  3. Exécutez la commande de copie avec CopyManager pour charger le CSV.

Donc, si vous traitez dans l'ordre, Comme l'écriture dans le stockage s'exécute deux fois (fichier et base de données), Je pense qu'il vaut mieux l'unifier et le mettre en œuvre.

Pour exécuter la commande de copie naïve en Java

Cela ressemble à ceci dans une écriture simple,

  public static long copy(Connection conn, String filePath, String tableName) throws Exception {
    CopyManager copyManager = new CopyManager((BaseConnection) conn);
    Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF8"));
    String sql = "copy " + tableName + " FROM STDIN WITH DELIMITER ','";
    long result = copyManager.copyIn(sql, reader);
    reader.close();
    return result;    
  }

Passer la connexion à CopyManager Créer une instance de l'interface de classe CSV Reader Passez-le à CopyIn et versez-le. À ce stade, on suppose que le CSV a la structure de colonne de la table telle quelle.

Où le donner?

Créez votre propre lecteur et J'ai pensé ajouter une colonne système au moment de la lecture, Créez une classe Reader qui implémente la méthode Read suivante.

public class CsvFileWithSysColReader extends Reader {
  /**File d'attente pour stocker des chaînes de caractères avec des colonnes*/
  private final Queue<Character> csvBuffer;
  /**Je vais le définir avec un argument dans le constructeur Reader de CSV*/
  private final BufferedReader reader = new ArrayDeque<>();
//~~ Abréviation ~~
  /**
   *constructeur
   * 
   * @lecteur de paramètres Lecteur tamponné
   * @throws IOException
   */
  public CsvFileWithSysColReader(final BufferedReader reader)
      throws IOException {
    //Il peut être bon d'avoir un booléen tel que skipPeader dans l'argument pour avoir une fonction de saut d'en-tête.
    this.reader = reader;
  }

  @Override
  public int read(final char[] cbuf, final int off, final int len) throws IOException {
    int readCount = len;
    //Si la taille du tampon de lecture CSV est inférieure au nombre de chiffres lus par la commande Copier, lisez le fichier.
    while (this.csvBuffer.size() < len) {
      //S'il s'agit du dernier du fichier, quittez et renvoyez uniquement le nombre actuel de chiffres.
      if (loadLine() == 0) {
        readCount = this.csvBuffer.size();
        break;
      }
    }
    //S'il y a une lecture, le nombre de chiffres est renvoyé.
    if (readCount != 0) {
      for (int i = off; i < readCount; i++) {
        cbuf[i] = this.csvBuffer.poll();
      }
      return readCount;
    } else {
      //Sinon, à la fin-Retour 1.
      return -1;
    }
  }

  /**
   *Charge de ligne
   * 
   * @return Load result nombre de caractères
   * @throws IOException
   */
  private int loadLine() throws IOException {
    final String line = this.reader.readLine();
    if (line == null) {
      //S'il n'y a pas de ligne d'acquisition, 0 est renvoyé et le processus se termine.
      return 0;
    } else {
      //addSysCol: une fonction qui ajoute des colonnes système, modifiez-les comme vous le souhaitez.
      //Il est également possible d'ajouter une colonne d'erreur en vérifiant ici
      final String lineWithSysCol= addSysCol(line);
      for (int i = 0; i < lineWithSysCol.length(); i++) {
        this.csvBuffer.add(lineWithSysCol.charAt(i));
      }
      return lineWithSysCol.length();
    }
  }
//~~ Abréviation ~~
}

Et exécutez comme ça.

  public static long copy(final Connection conn, final String filePath, final String tableName) throws Exception {
    final CopyManager copyManager = new CopyManager((BaseConnection) conn);
    final Reader reader = new CsvFileWithSysColReader(new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF8")));
    final String sql = "copy " + tableName + " FROM STDIN WITH DELIMITER ','";
    final long result = copyManager.copyIn(sql, reader);
    reader.close();
    return result;    
  }

L'implémentation ci-dessus de CsvFileWithSysColReader.addSysCol (ligne de chaîne) étend la plage comme suit.

  1. Donnez des informations qui ne sont pas au format CSV en les transmettant de l'extérieur.
  2. Validez et définissez la colonne du tableau pour charger les résultats
  3. Coupez le débordement de chiffres en fonction du nombre de chiffres dans la colonne du tableau
  4. Numéroter les numéros de série
  5. etc...

en conclusion

Dans le développement d'applications Les E / S sont souvent fixes, donc Si vous créez une classe d'habillage avec Interface et absorbez le traitement là-bas Il y a beaucoup de choses à faire.

Au fait En fait, je l'ai implémenté avec diverses fonctions, J'ai abandonné la fonction à partir de là et n'ai écrit que les points principaux, Je suis désolé s'il y a une omission. .. ..

Recommended Posts

Comment exécuter la commande de copie Postgresql avec des informations de colonne sur Java
[Java] Comment exécuter des tâches régulièrement
Comment changer de version Java avec direnv dans le terminal sur Mac
Comment vérifier Java installé sur Mac
Comment compiler Java avec VsCode & Ant
[Java] Résumez comment comparer avec la méthode equals
Comment changer de version de Java sur Mac
[Java] Comment tester s'il est nul dans JUnit
Comment utiliser le framework Java avec AWS Lambda! ??
Comment utiliser l'API Java avec des expressions lambda
[Java] Mémo sur la façon d'écrire la source
Comment appeler des fonctions en bloc avec la réflexion Java
Comment exécuter javafx avec Raspeye publié le 12/07/2020
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
[Java] Comment omettre l'injection de constructeur de ressort avec Lombok
Comment déployer Java sur AWS Lambda avec Serverless Framework
Comment utiliser la bibliothèque non standard Java sur IntelliJ IDEA
[Ruby on Rails] Comment changer le nom de la colonne
[Java] Comment chiffrer avec le chiffrement AES avec une bibliothèque standard
Exécutez PostgreSQL sur Java
À partir d'avril 2018 Comment installer Java 8 sur Mac
Connexion de l'application Java et de PostgreSQL avec JDBC sans utiliser eclipse (exécuté à l'invite de commande)
Comment créer un environnement de développement Java avec VS Code
Comment exécuter Java EE Tutial sur github sur Eclipse
Introduction à la commande java
Comment exécuter l'exemple WebCamCapture de NyARToolkit pour Java
[Java] Comment rompre une ligne avec StringBuilder
Remarques sur l'utilisation des expressions régulières en Java
Que faire si vous ne pouvez pas exécuter avec la commande "nom du package Java / nom de la classe"
Comment développer une application avec l'API Jersey Java RESTful sur une instance Alibaba Cloud ECS
Comment réduire même un peu la charge du programme lors de la combinaison de caractères avec JAVA
Comment inverser la compilation du fichier apk en code source Java avec MAC
Comment utiliser le modèle entraîné Tensorflow 2.0 avec Kotlin / Java
Comment gérer les exceptions froidement avec Java 8 Stream ou en option
Comment déployer une application Java Servlet simple sur Heroku
Comment déployer une application kotlin (java) sur AWS Fargate
Comment installer java9 sur elementaryOS Freya ou Ubuntu 14.04 LTS
Comment changer Java à l'ère d'OpenJDK sur Mac
Comment démarrer avec JDBC en utilisant PostgresSQL sur MacOS
A étudié comment appeler des services avec Watson SDK pour Java
Comment abaisser la version java
[Java] Comment utiliser Map
Comment désinstaller Java 8 (Mac)
Java pour jouer avec Function
Java - Comment créer JTable
Comment utiliser java Facultatif
Comment déployer avec heroku
Comment réduire les images Java
Exécution de commande externe avec swift
Comment rédiger un commentaire java
Comment utiliser la classe Java
Connectez-vous de Java à PostgreSQL
[Java] Comment utiliser removeAll ()
[Java] Comment afficher les Wingdings
Comment numéroter (nombre) avec html.erb
Comment utiliser Java Map
Comment mettre à jour avec activerecord-import