2016-09-06 4 views
0

J'ai une exportation de données à partir d'un système Progress OpenEdge que je veux analyser en JavaScript. Je voudrais trouver tous les champs de l'exportation en utilisant une expression régulière.Regex pour l'analyse des chaînes avec des guillemets dans l'exportation de données OpenEdge

J'ai essayé beaucoup de choses semblables à ceci: /("[^"]*")|[^\s]+/g J'ai également essayé d'expérimenter avec le lookahead négatif (?!"") mais jusqu'ici je n'ai pas réussi.

Un échantillon de sortie d'exportation pourrait ressembler à quelque chose semblable à ceci:

12345 24,25 0 2015-06-30T14:53:14.891 "12345" "24,25" "0" "2015-06-30T14:53:14.891" "" yes no ? "String with ""quoted"" word" "String 
with a multi 
line string. "" <- Just a quote 
" " This is the last value " 
6789 35,36 0 2016-07-31T15:54:15.892 "6789" "35,36" "0" "2016-07-31T15:54:15.892" "" no yes ? "Just a simple string" ? ? 

Les champs sont:

DEFINE TEMP-TABLE tt_test NO-UNDO 
    FIELD valueA AS INTEGER 
    FIELD valueB AS DECIMAL 
    FIELD valueC AS INTEGER 
    FIELD valueD AS DATETIME 
    FIELD valueE AS CHARACTER 
    FIELD valueF AS CHARACTER 
    FIELD valueG AS CHARACTER 
    FIELD valueH AS CHARACTER 
    FIELD valueI AS CHARACTER 
    FIELD valueJ AS LOGICAL 
    FIELD valueK AS LOGICAL 
    FIELD valueL AS LOGICAL 
    FIELD valueM AS CHARACTER 
    FIELD valueN AS CHARACTER 
    FIELD valueO AS CHARACTER 
. 

Le format d'exportation est: Tous les champs sont séparés par un espace. Les chaînes sont contenues entre guillemets (") .S'il y a une citation dans la chaîne qui est échappée en utilisant deux guillemets (" ") .S'il y a une chaîne vide qui est aussi deux guillemets (« ») mais avec des espaces délimiteurs autour d'eux.

les types de données réelles et le fait que cela est un système d'avancement n'a pas d'importance, il est juste de donner un contexte à ma question.

donc, pour résumer : Comment puis-je écrire une expression régulière (compatible avec JavaScript) qui sépare avec succès les différentes parties des données exportées tout en ignorant les guillemets doubles dans les chaînes?

Répondre

1

Je ne pense pas que ce soit faisable avec une seule expression régulière. Vous allez avoir besoin d'un analyseur ici. Heureusement, il sera assez facile à écrire, par exemple:

str = `12345 24,25 0 2015-06-30T14:53:14.891 "12345" "24,25" "0" "2015-06-30T14:53:14.891" "" yes no ? "String with ""quoted"" word" "String 
 
with a multi 
 
line string. "" <- Just a quote 
 
" " This is the last value " 
 
6789 35,36 0 2016-07-31T15:54:15.892 "6789" "35,36" "0" "2016-07-31T15:54:15.892" "" no yes ? "Just a simple string" ? ?`; 
 

 
str = str.replace(/""/g, '@'); 
 

 
matches = str.match(/"([\s\S]*?)"|\S+|\n/g); 
 

 
rows = [[]] 
 

 
for(var m of matches) { 
 
    if (m === '\n') { 
 
     rows.push([]); 
 
     continue; 
 
    } 
 
    if(m === '@') { 
 
     m = ''; 
 
    } 
 
    if (m[0] === '"') { 
 
     m = m.slice(1, -1); 
 
    } 
 
    m = m.replace(/@/g, '"'); 
 
    rows[rows.length - 1].push(m) 
 
} 
 

 
console.log(rows)

+0

Merci! J'avais peur que cela puisse être le cas. – Patrik