J'ai un problème avec le split et je ne sais pas comment le résoudre.

Je veux diviser un fichier CSV, en évitant certains caractères ' " ', et cela fonctionne bien, mais certaines lignes contiennent du texte comme dans l'exemple suivant :

Robert, Pattinson, rober@company.com, "London street, 19", London

Il se divise comme ceci :

Robert
Pattinson
rober@company.com
london street
19
London

Et je veux le diviser comme ceci:

Robert 
Pattinson 
rober@company.com 
London street, 19 
London

Voici la commande que j'utilise pour cela :

let content = (evt.target as FileReader).result.toString().replace(/["]/g,'');

Comment puis-je réparer cela?

Merci d'avance.

MODIFIER:

Je viens de remarquer que j'ai oublié d'inclure l'intégralité du code à diviser, le voici :

let content = (evt.target as FileReader).result.toString().replace(/["]/g,''); 
let lines = content.split('\n'); 
let commaSeparated = lines.map(function(line) { 
return line.split(',');
});
0
Emilio Fernandez 6 mars 2019 à 19:05

2 réponses

Meilleure réponse

Si vous vous attendez à ce que la chaîne suive toujours le même format, 5 éléments séparés par des virgules pouvant inclure ou non des guillemets doubles, alors pourquoi ne pas utiliser des expressions régulières pour extraire les informations ?

Si votre chaîne va comme : Robert, Pattinson, rober@company.com, "London street, 19", London

Ensuite:

var str = 'Robert, Pattinson, rober@company.com, "London street, 19", London';
var arr = str.split(/^"[^"\\]*(?:\\.[^"\\]*)*"|[^,]?$/);
console.log(arr);

Notez que mon expression régulière ne fonctionne pas correctement à 100%. Il détecte un élément supplémentaire à la fin ; cependant, si vous l'ignorez, vous obtenez tous les éléments dans un tableau auquel il est facile d'accéder.

Bien sûr, vous devez faire votre version en Java mais cela ne devrait pas être si difficile puisque ses expressions régulières.

0
acarlstein 6 mars 2019 à 18:40

Je suppose que vous n'avez pas de guillemets échappés dans vos données citées, comme "Dites-lui que j'ai dit, \"Bonjour,\" s'il vous plaît." Ensuite, vous pouvez commencer par diviser les guillemets, vous débarrasser des virgules de début et de fin, puis diviser par des virgules et aplatir :


> 'one, "two, three,", four, "five, six", seven, eight, nine'
    .split('"')
    .map((x,i)=>i&1
      ?[`"${x}"`]
      :x.replace(/\s*,\s*$/,'')
        .replace(/^\s*,\s*/,'')
        .split(','))
    .map(a=>a.map(x=>x.trim()))
    .flat()

<· ["one", '"two, three,"', "four", '"five, six"', "seven", "eight", "nine"]
0
Mike Stay 6 mars 2019 à 17:12