Avatar billede tvilling53 Seniormester
05. marts 2021 - 11:41 Der er 4 kommentarer

Hvor dan "fanger" man et linie skift i csv-fil??

Hej, jeg er ved at prøve at lave et 2-dimensionel array ud fra en csv-fil, men kan ikke "fange" linieskift, Jeg har prøvet alle løsninger som jeg kunne tænke mig til, men åbentbart ikke det rigtige.
Jeg har følgende kode:

function loadDoc(url, cFunction) {
  var xhttp;
  xhttp=new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      cFunction(this);
    }
  };
  xhttp.open("GET", url, true);
  xhttp.send();
}
function myFunction(xhttp) {
  var str = ""; const chr = 013;
  let csvarray = [];
  var data = xhttp.responseText;
  data = data.replace(/"/gi,"");
  console.log(data.length);
  var x=0; var y = 0;
  for(i=0;i<=data.length;i++){
    var c = data.substr(i,1);
    switch(c){
      case ";":
        console.log(x,y);console.log(str);
        csvarray[x][y] = str;
        str = "";
        y++;
      break;
      case "013"://Hvad skal der stå her for at "fange" et linieskift??
        alert('Ny linie');
        str="";
        x=x+1;
        y=0;
       
      break;
      default:
        str = str+c;
       
    }
  }
}

Herer csv-filen;
"12345678901";"12345678901";"";04-01-2021;"BS GF-FORSIKRING A/S";-6367,25; 3627,60;"";"";
"12345678901";"12345678901";"";04-01-2021;"BS FASANV�NGET";-800,00; 2827,60;"";"";
"12345678901";"12345678901";"";04-01-2021;"BS AL FINANS A/S";-735,00; 2092,60;"";"";
"12345678901";"12345678901";"";04-01-2021;"BS BOXER A/S";-448,75; 1643,85;"";"";
"12345678901";"12345678901";"";04-01-2021;"BS FAGLIGT F�LLES FORBUND";-92,50; 1551,35;"";"";
"12345678901";"";"12345678901";04-01-2021;"0349839"; 6250,00; 7801,35;"";"";
"12345678901";"12345678901";"";05-01-2021;"BS SYGEFORSIKRINGEN DANMARK";-380,00; 7421,35;"";"";
"12345678901";"12345678901";"";07-01-2021;"BS 341 E/F ";-2931,00; 4490,35;"";"";
"12345678901";"12345678901";"";08-01-2021;"BS KOMMUNE";-1080,45; 3409,90;"";"";
"12345678901";"12345678901";"0349839";29-01-2021;"0349839";-1500,00; 1909,90;"";"";
"12345678901";"12345678901";"";01-02-2021;"BS DR LICENS";-309,50; 1600,40;"";"";
"12345678901";"12345678901";"";01-02-2021;"BS AL FINANS A/S";-735,00; 865,40;"";"";
"12345678901";"12345678901";"";01-02-2021;"BS BOXER A/S";-448,75; 416,65;"";"";
"12345678901";"12345678901";"";01-02-2021;"BS FAGLIGT F�LLES FORBUND";-92,50; 324,15;"";"";
"12345678901";"12345678901";"";01-02-2021;"BS ENERGI A/S";-256,45; 67,70;"";"";
"12345678901";"";"12345678901";01-02-2021;"0349839"; 6250,00; 6317,70;"";"";
"12345678901";"12345678901";"";04-02-2021;"BS 341 E/F ";-2931,00; 3386,70;"";"";

Håber at der en der kan hjælpe. På forhånd tak.
VH Thomas V.
Avatar billede bvirk Guru
05. marts 2021 - 13:50 #1
konseptet du anvender fejler mht.

1. linieskift i værdier adskiller sig fra 'næste post (x) linieskift' ved at  være i gåseøjne - men de smides væk i 'data = data.replace(/"/gi,"");'
2. felt seperator tegnet ';' er ikke et sådant hvis det befinder sig indenfor et gåseøjne par - med andre ord - der skal tælles gåseøjne indefor hver linie - hvor linieskift er defineret som et postseperat lineskift hvis lige antal gåseøjne er passeret.

Men det er heller ikke en triviel ting at lave rigtig, men med javascript med dets regular expression kan det lade sig gøre. Dette er en af de herlige snippets man kan finde:
https://stackoverflow.com/questions/1293147/example-javascript-code-to-parse-csv-data

Den indeholder et genialt regular expression udtryk som jeg ikke vil kaste mig ud i at forklare, med det her der forholdes sig til om et lige eller ulige antal gåseøjne er passeret - det kendetegner en mænde af de snippets der kan opstøves:
"(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|"
Avatar billede bvirk Guru
05. marts 2021 - 13:55 #2
... og måske om et gåseøje er et omsluttende eller feltindhold (to efter hinanden efter ulige antal - det også et konsept der idelt set skal tages vare på.
Avatar billede tvilling53 Seniormester
05. marts 2021 - 17:06 #3
Hej, det gør ikke nogen forskel om " " er fjernet eller ej, og lave ; om til , kan man heller ikke fordi der decimaltal. Man kan fjerne og indsætte linieskift i filen der er på localhost og den der ligger på comp uden at det gør en forskel. Jeg må så konstatere at det ligger over mit niveau, men tak for indsatsen.
VH Thomas V
Avatar billede tvilling53 Seniormester
15. marts 2021 - 16:02 #4
Hej, efter en del youtube og W3schol er jeg nu kommet frem til dete:

function loadDoc(url, cFunction) {
  var xhttp;
  xhttp=new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
      cFunction(this);
    }
  };
  xhttp.open("GET", url, true);
  xhttp.send();
}
function myFunction(xhttp) {
  var str = "";
  var csvarray = [[]];
  var data = xhttp.responseText;
  data = data.replace(/"/gi,"");
  console.log(data.length);
  var x=0; var y = 0;
  for(i=0;i<data.length;i++){
    var c = data.substr(i,1);
    switch(c){
      case ";":
        csvarray.push(str);
        console.log(x,y,str);
        str = "";
        y++;
        c="";
      break;
      case "\r":
        str="";
        y=0;
        x++;
        c="";
      break;
      default:
        str = str+c;
        c="";
    }
  }
  document.getElementById("demo1").innerHTML = data;
  document.getElementById("demo2").innerHTML = csvarray;
  document.getElementById("demo3").innerHTML = csvarray[3][4];
}
Forskellen på data og csvarray er at " ; "er blevet udskiftet med " , " .
Console.log(x,y,str) viser et 2dim,array men jeg kan ikke med "demo3" trække data ud af array'et , er der nogen der hjælpe mig med at løse 'gåden'. På forhånd tak.
Vh Thomas V
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester