[JAVA] J'ai essayé de lire et de sortir CSV avec Outsystems

introduction

Je publierai mon deuxième article sur le calendrier de l'Avent 2019, qui est membre des membres informatiques de l'entreprise! C'est l'article que j'ai écrit la dernière fois, qui sert également d'auto-introduction. https://qiita.com/tom-k7/items/d8ef19dccb42891a0698

J'écrirai aussi cette fois sur Outsystems. En ce moment, je développe un outil de conversion CSV (application web) avec Outsystems, donc Je vais partager comment implémenter la lecture et la sortie CSV avec Outsystems, et le mur que j'ai rencontré pendant le développement.

Chose que tu veux faire

Ce que je veux faire avec l'outil que je développe maintenant, c'est Fichiers CSV téléchargés à partir des sites de diverses autres entreprises Je souhaite le convertir en fichier CSV dans un format pouvant être importé dans le système utilisé en interne. Alors, lisez le fichier CSV téléchargé et Outsystems permet de convertir et de sortir un nouveau fichier CSV. Forge Utilisez le composant Forge de CSVUtil pour lire et générer des fichiers CSV. https://www.outsystems.com/forge/component-overview/636/csvutil

Téléchargez-le, installez-le dans Service Studio et ajoutez-le à Dependency.

Développement d'écran

Je vais faire un écran avant de faire le traitement CSV.

Télécharger un fichier CSV

Tout d'abord, vous devez télécharger le fichier CSV à lire. Il y a deux manières. ① Utilisez Upload image.png ② Utilisez RichWidgets \ Popup_Upload image.png

Cette fois, ① est mieux, donc j'utiliserai Upload.

Placez un bouton pour appeler l'action serveur qui exécute le processus de conversion

Spécifiez l'action Convertir le serveur qui exécute le traitement de conversion dans la Destination du bouton Convertir, Exécutez le processus de conversion dans cette action serveur. image.png

Implémentation du processus de lecture CSV

Désormais, c'est le traitement CSV du sujet principal. Tout d'abord, implémentez la lecture du fichier CSV.

Paramètres LoadConfig

Définissez une variable locale de type CSVLoadConfig à définir lors de la lecture de CSV et définissez-la avec Assign. image.png Les principaux paramètres sont les suivants.

--Encode: code de caractère du fichier CSV. Réglez utf-8, shift-jis, etc. --IsSkipHeader: True si le fichier CSV a une ligne d'en-tête, False sinon. --IsIgnoreColumnChange: ~~ False si une erreur se produit lorsque le nombre de colonnes ne correspond pas, True si aucune erreur ne se produit. ~~ Je l'ai essayé et c'était différent. .. Ce champ est un mystère "(-" "-)" --FieldDelimiter: Délimiteur entre les colonnes. Plusieurs caractères peuvent être saisis, mais seul le premier caractère est appliqué. --IsDisableDoubleQuote: False si la colonne est entourée de guillemets doubles, True sinon.

Définir une RecordList pour la lecture

Définissez une liste d'enregistrements d'entité / structure qui stocke les résultats de la lecture de CSV avec des variables locales. Cette fois, j'ai créé une liste d'enregistrement de la structure appelée Source CSV que j'ai créée. image.png

Traitement des extensions d'appel

Appelez l'action de serveur LoadCSVRecordList définie dans le CSVUtil de Forge Les arguments sont le contenu de téléchargement créé à l'écran et la variable locale CSVLoadConfig. Définissez le résultat de la conversion de RecordList d'entité / structure avec ToObject (). image.png Ceci termine le chargement.

Implémentation du traitement de sortie CSV

Ensuite, nous implémenterons également la sortie CSV.

Paramètres ExportConfig

Définissez une variable locale de type CSVExportConfig à définir au moment de la sortie CSV et définissez-la avec Assign. image.png Les principaux paramètres sont les suivants.

--IsShowHeader: True si vous souhaitez inclure la ligne d'en-tête dans le fichier CSV, False sinon. --FieldDelimiter: Délimiteur entre les colonnes. Plusieurs caractères peuvent être saisis, mais seul le premier caractère est appliqué. --EncodeMode: s'il faut mettre la colonne entre guillemets doubles. Définissez l'un des paramètres auto / quote / noquote / noquote_nocheck comme chaîne de caractères. --LineSeparator: code de saut de ligne. Réglez Chr (13) pour CR, Chr (10) pour LF et Chr (13) + Chr (10) pour CRLF.

Définir RecordList pour la sortie

Définissez une liste d'enregistrements d'entité / structure pour stocker les données CSV de sortie avec des variables locales. L'image est une liste d'enregistrements de structure appelée CSV de sortie que j'ai créée. image.png

Convertir et définir les données lues dans la RecordList de sortie

Pour la RecordList de sortie définie dans ↑, définissez toute la RecordList contenant les données chargées. À ce moment-là, vous pouvez convertir les valeurs, les combiner, supprimer celles qui ne sont pas nécessaires et les définir pour la sortie. image.png Dans l'image, ListAppendAll est utilisé pour simplement combiner les éléments, mais en réalité, diverses conversions sont effectuées ici. Si vous voulez faire quelque chose d'assez compliqué, vous pouvez boucler dans For Each.

Traitement des extensions d'appel

Appelez l'action de serveur ExportRecordList2CSV définie dans CSVUtil Définissez le résultat de la conversion RecordList de Entity / Structure avec ToObject () et la variable locale de CSVExportConfig dans l'argument. image.png

Sortie (téléchargement) du fichier CSV après la conversion

Enfin, transmettez les données CSV créées par ExportRecordList2CSV au widget Télécharger et terminez. image.png

Piège attrapé pendant le développement

Ce qui précède est la méthode de mise en œuvre, mais je voudrais partager d'autres murs que j'ai frappés en utilisant CSVUtil.

Il est difficile de comprendre comment mettre entre guillemets doubles au moment de la sortie

La méthode de clôture avec double guillemet dans "Export Config Settings" a déjà été décrite, Il m'a fallu un certain temps pour y arriver. Parce que le nom de l'élément est EncodeMode. .. Je pense que c'est un code de caractère. Je ne sais pas. .. C'était une ww douce-amère

Au fait, si vous spécifiez "quote" dans CSVExportConfig.EncodeMode, il sera entouré de guillemets doubles!

NullReferenceException dans le processus d'exportation

J'ai eu cette erreur en appelant l'action de serveur ExportRecordList2CSV de CSVUtil. Object reference not set to an instance of an object. NullReferenceException. C'est Nurpo à Java. Comme seul le type de base est utilisé comme élément CSV, existe-t-il un type de base Null dans Outsystems? C'était comme ça.

Donc, cette erreur ne se connecte pas plus en détail, donc j'étais perdu en essayant diverses choses. Je n'ai pas d'autre choix que de regarder à l'intérieur de l'extension! C'est devenu. J'ai téléchargé l'extension avec, ouvert sln dans Visual Studio et suivi la source, mais je n'ai pas pu en comprendre la cause. Au fait, j'ai créé les données que j'ai réellement transmises sur C # et les ai exécutées! (^^)! (C'était sobre et ennuyeux)

À la suite de cela, il s'est avéré qu'il s'agissait d'une exception NullReferenceException en raison de l'absence d'une colonne des données transmises. Je me demandais quelle était cette colonne, mais c'était une colonne qui faisait quelque chose de spécial lors de la conversion des données.

Je suis désolé si l'explication n'a pas de sens <m (__) m> Par exemple, si la valeur des données lues est "1", définissez quelque chose comme "études supérieures" dans le fichier JSON en tant que paire clé / valeur après la conversion. Importez le fichier JSON en tant que ressources dans le module. image.png

Lisez le fichier JSON avec JSONDeserialize, utilisez le HashTable de Forge pour le stocker en mémoire en tant que paire clé / valeur, Au moment de la conversion, le processus consistait à définir la valeur obtenue à partir du HashTable.

Forge Hashable: https://www.outsystems.com/forge/component-overview/21/hashtable

Comme c'est dans le CSV que sont lues les données qui ne sont pas dans la clé définie dans JSON (comme "5" ou des caractères vides dans ↑ JSON), le résultat de get devient Null, C'était une NullReferenceException parce que je l'ai passée à ExportRecordList2CSV.

Si je l'implémente normalement avec Outsystems, Null ne sera pas inclus dans le type Text, J'ai appris que Null peut être entré via Extension, et j'ai pensé que c'était une expérience d'apprentissage.

finalement

Lecture / sortie CSV expliquée dans Outsystems. J'espère que cela aidera ceux qui utilisent CSVUtil et ceux qui se heurtent désormais au même mur.

Recommended Posts

J'ai essayé de lire et de sortir CSV avec Outsystems
J'ai démarré MySQL 5.7 avec docker-compose et j'ai essayé de me connecter
J'ai essayé d'interagir avec Java
J'ai essayé de démarrer avec Web Assembly
J'ai essayé de mesurer et de comparer la vitesse de Graal VM avec JMH
J'ai essayé de faire une authentification de base avec Java
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé de gérer les informations de connexion avec JMX
J'ai essayé de lier grafana et postgres [docker-compose]
J'ai aussi essayé Web Assembly avec Nim et C
J'ai essayé de sortir quatre-vingt-dix-neuf en Java
J'ai essayé de lier JavaFX et Spring Framework.
J'ai essayé de casser le bloc avec java (1)
Mémo: [Java] Traiter le csv lu (extraire et modifier selon les conditions) et sortir
J'ai essayé de convertir Java Bean et XML avec le formateur XML de Jackson à cette époque
J'ai essayé ce que je voulais essayer avec Stream doucement.
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
[Java 11] J'ai essayé d'exécuter Java sans compiler avec javac
J'ai essayé d'intégrer le bouton AWS I oT et Slack
J'ai essayé de démarrer avec Spring Data JPA
J'ai essayé de dessiner une animation avec l'API Blazor + canvas
J'ai essayé d'implémenter Sterling Sort avec Java Collector
Je veux faire des transitions d'écran avec kotlin et java!
J'ai essayé de mâcher C # (lire et écrire des fichiers)
J'ai essayé de créer une fonction / écran d'administrateur de site commercial avec Java et Spring
J'ai essayé d'appeler une vidéo YouTube de DB avec haml et de l'afficher intégrée
Sortie de fichier csv avec csv ouvert
J'ai essayé DI avec Ruby
Sortie CSV par Apache Commons CSV
J'ai essayé node-jt400 (lecture IFS)
J'ai essayé UPSERT avec PostgreSQL.
J'ai essayé BIND avec Docker
J'ai essayé de vérifier yum-cron
J'ai essayé de créer un environnement de développement java8 avec Chocolatey
J'ai essayé de moderniser une application Java EE avec OpenShift.
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
J'ai essayé de collecter et de résoudre les problèmes liés à la «classe» de Ruby.
J'ai essayé de résumer les bases de kotlin et java
[Rails] J'ai essayé de créer une mini application avec FullCalendar
J'ai essayé de vérifier ceci et celui de Spring @ Transactional
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
J'ai essayé de faire coexister Java Optional et la clause de garde
J'ai essayé de lier le chat avec le serveur de Minecraft avec l'API Discord
J'ai essayé de résumer les applications et les outils de développement personnellement utiles (outils de développement)
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
J'ai essayé de résumer les applications et les outils de développement personnellement utiles (Apps)
Je veux implémenter diverses fonctions avec kotlin et java!
J'ai essayé de créer un environnement de développement padrino avec Docker
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot
[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit
J'ai essayé de pouvoir passer plusieurs objets avec Ractor
Facile à créer LINE BOT avec Java Servlet Partie 2: J'ai essayé des messages image et des modèles