Skip to content

$csv.parse

Description

Parse un fichier CSV et appelle une fonction de callback pour chaque enregistrement lu.

$csv.parse vs $csv.nextRecord

Les méthodes $csv.parse et $csv.nextRecord permettent toutes les deux de parcourir un CSV et d'effectuer un traitement pour chaque enregistrement. Les deux méthodes varient quant à l'approche pour réaliser le traitement.

Avec la méthode $csv.parse, c'est Ewt qui itère sur les enregistrements du CSV et qui invoque une fonction de callback chargée de traiter les données.

Avec la méthode $csv.nextRecord, c'est le script qui itère sur les enregistrements du CSV et qui traite les données.

Le choix de l'approche appartient donc au développeur, d'autant que les performances des deux méthodes sont sensiblement identiques.

Syntaxe

$csv.parse( csv , callback [ , options ] )

Paramètres

csv pojo

Fichier CSV ou texte contenant le CSV.

Peut également être une référence de CSV obtenue via $csv.load. Attention toutefois: si le script utilise une référence de CSV, il a la responsabilité de la fermer correctement à l'aide de $csv.close. Il est recommandé dans ce cas d'effectuer le $csv.close dans clause finally.

callback function

Fonction de callback à appeler pour chaque enregistrement lu du CSV. La fonction de callback reçoit un tableau contenant les valeurs du record ainsi que le numéro du record. La fonction de callback doit donc être déclarée ainsi:

function(data, index) { ... }

Si la fonction de callback retourne la valeur false, cela met fin au traitement du parseur.

options map

Map d'options pour le chargement du CSV. Les options reconnues sont:

format pojo / map
Format de CSV. Doit être un objet pojo construit au moyen de $csv.makeFormat ou un map qui reprend les mêmes règles que celles attendues par $csv.makeFormat
charset string
Charset des données du CSV. Si non spécifié, les données sont traitées selon le charset UTF-8.

Retour

Retourne true si le parsing a pu se faire en intégralité et sans erreur, sinon false

Exemple

L'exemple ci-dessous effectue le même traitement que celui donné pour la méthode $csv.nextRecord. Les performances de cette variante sont sensiblement identiques à la version qui utilise $csv.nextRecord.

 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// préparation de la table de destination
$sql.update("create table tmpCsv(EGID varchar(9),
                                 EDID varchar(2),
                                 EGAID varchar(9),
                                 DEINR varchar(12),
                                 ESID varchar(8),
                                 STRNAME varchar(120),
                                 STRNAMK varchar(48),
                                 STRINDX varchar(6),
                                 STRSP varchar(4),
                                 STROFFIZIEL varchar(1),
                                 DPLZ4 varchar(4),
                                 DPLZZ varchar(2),
                                 DPLZNAME varchar(80),
                                 DKODE varchar(11),
                                 DKODN varchar(11),
                                 DOFFADR varchar(1),
                                 DEXPDAT varchar(10))"::T);
$sql.update("delete from tmpCsv");  // note: SQLite ne supporte pas "truncate"

// nombre max de records envoyés en DB à la fois
const maxCounter = 250;

// prototype de requête d'insertion
const sqlProto = "insert into tmpCsv(EGID,EDID,EGAID,DEINR,ESID,STRNAME,STRNAMK,STRINDX,STRSP,STROFFIZIEL,DPLZ4,DPLZZ,DPLZNAME,DKODE,DKODN,DOFFADR,DEXPDAT) values ";

// fonction d'écriture des données en DB
function flushData(data) {
    $sql.insert(sqlProto & data);
}

// chargement du CSV
var src = $file.load("C:/Temp/ch/eingang_entree_entrata.csv");
var sqlData = "";   // lot de valeurs à passer à la requête INSERT

var beg = $cal.timestamp(); // juste pour calculer le temps de traitement total

$csv.parse(src,
    function(row, idx) {
        var values = "";
        for (var col : row) {
            values &= ",'${col::Q}'";
        }

        // on ajoute les valeurs à notre lot de values
        sqlData &= ",(" & $string.substring(values, 1) & ")";

        // on contrôle s'il y a lieu de faire un flush
        if (idx % maxCounter == 0) {
            flushData($string.substring(sqlData, 1));  // on skip la 1re virgule
            sqlData = "";           // reset du lot de values
        }

        // comptage de ligne et affichage d'un log tous les 10'000 records
        if (idx % 10000 == 0) $logger.info(idx);
    },
    {
        format: { format: "tdf", skipHeaderRecord: true }
    });

// on flush le solde de data
if (sqlData != "") {
    flushData($string.substring(sqlData, 1));
}

$logger.info("Duration: " & $cal.diff(beg, $cal.timestamp()));