Cum pot evita probleme cu virgula in fisiere CSV ?

Intrebari despre Actionscript 2.0

Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde george.profenza » Sâm Apr 28, 2012 1:12 pm

Salut,

Am o mica problema cu niste date dintr-un fisier CSV care contine caracterul virgula.
Stiu ca in as3 se poate evita situatia cu RegEx, dar in as2 trebuie sa folosesc o librarie/clasa externa,
care as prefera sa nu o folosesc.

Un exemplu simplu de csv:
Cod: Selectaţi tot
data,nume,descriere
4/1/12,nume 1,bla bla bla
4/2/12,un, nume ,bla bla bla
4/3/12,nume 3,bla bla bla

Cod: Selectaţi tot
var lv:LoadVars = new LoadVars();
lv.onData = function(raw:String):Void{
   var data:Array = raw.split('\n');
   var header:Array = data[0].split(',');
   for(var i:Number = 1 ; i < data.length; i++) trace('row: ' + i + ' cols: ' + header.length + ' values: ' + data[i].split(','));//?
}
lv.load('file.csv');


Exista alte optiuni ? Ce solutii exista pentru as2 care nu folosesc cod extern ?
george.profenza
 
Mesaje: 57
Membru din: Mie Aug 13, 2008 11:42 am

Re: Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde Barna Biro » Dum Apr 29, 2012 2:45 pm

Sorry dar nu am inteles exact cu ce ai problema... Ce se poate evita in AS3.0?
Can you please explain? The following works without a problem:

Cod: Selectaţi tot
var cvs:String =
"data,nume,descriere\n" +
"4/1/12,nume 1,bla bla bla\n" +
"4/2/12,un, nume ,bla bla bla\n" +
"4/3/12,nume 3,bla bla bla";

var rows:Array = cvs.split("\n");
for (var i:Number = 0; i < rows.length; i++) {
   var columns:Array = rows[i].split(",");
   for (var j:Number = 0; j < columns.length; j++) {
      trace("Row " + i + ": " + columns[j]);
   }
}


Output scrie:Row 0: data
Row 0: nume
Row 0: descriere
Row 1: 4/1/12
Row 1: nume 1
Row 1: bla bla bla
Row 2: 4/2/12
Row 2: un
Row 2: nume
Row 2: bla bla bla
Row 3: 4/3/12
Row 3: nume 3
Row 3: bla bla bla
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland

Re: Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde george.profenza » Dum Apr 29, 2012 2:54 pm

Merci de raspuns Biro.

Imi cer scuze, nu am explicat indeajuns de amanuntit problema: "un, nume".

Can e parsat prin split(',') obtii:
Row 2: 4/2/12
Row 2: un
Row 2: nume
Row 2: bla bla bla


Intrebarea mea e cum pot obtine:
Row 2: 4/2/12
Row 2: un, nume
Row 2: bla bla bla

avand in vedere ca e un document csv :(

Stiu cate coloane ar trebui sa fie din header/Row0
Pentru Row2 as vrea sa obtin 3 valori, nu 4.
george.profenza
 
Mesaje: 57
Membru din: Mie Aug 13, 2008 11:42 am

Re: Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde Barna Biro » Dum Apr 29, 2012 3:09 pm

Ahh, mda, nici n-am observat treaba aia initial...

Buna intrebare sa stii... Esti sigur ca exista o solutie general valabila in AS3.0? Problema cu fisierele CVS este ca split-ul facut de Excel este dependent de setarile calculatorului respectiv. De ex, poate acuma split-ul il faci cu virgula, dar poate maine primesti un export de la altcineva unde separatorul este ";" ( sau altceva ), atunci ce faci? :) Oricum, nu asta e problema pana la urma... problema cea mai mare este ca nu prea ai cum sa delimitezi calumea coloanele ( cred ca nici Excel nu ar separa valorile calumea in cazul in care separatorul de coloane este "," si tu folosesti acelasi symbol in interiorul valorilor cu un scop total diferit decat cel de a separa coloanele ).

Poti verifica treaba asta? Chiar daca stii ca ai 3 coloane, din moment ce ai 5 virgule, nu prea vad cum ai putea sa decizi 100% sigur ca "da, coloana 1 este intre virgulele 1-3; coloana 2 este intre virgulele 3-4; si coloana 3 este intre virgulele 4-5" ( cu atat mai nasol cand numarul de virgule este variabila si regula de delimitare se schimba ).

Ideal ar fi ca separatorul de coloana sa nu fie in conflict cu vreun alt symbol valid dintr-o valoare... Desigur, daca schimbi separatorul atunci probleme vor aparea in momentul in care cineva vrea sa deschida .cvs-ul in Excel si PC-ul lui nu este configurat sa split-uie coloanele cu separatorul special definit de tine.

PS: Poti lasa un link la acele librarii externe de care ziceai? Also, cum exact se handle-uie problema in AS3.0 cu RegEx? Sunt curios ce fac acele librarii pentru ca momentan nu prea imi imaginez ca ar exista o solutie "general valabila" pentru .cvs in lipsa unui pattern custom definit de tine la generarea fisierului ( daca te poti trezi cu fisiere .cvs generate de cine stie cine si cu ce configuratii, sunt destul de convins ca o sa te lovesti eventually de probleme )...
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland

Re: Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde george.profenza » Dum Apr 29, 2012 4:45 pm

Salut Biro,

Merci pentru sugestii, datorita lor am gasit o solutie.

Buna idea cu ";", din pacate aplicatia de pe server care returneaza csv-ul exporta numai cu "," ca separator
si nu am niciun control pe partea respectiva. As putea sa scriu un scurt script php care incarca rezultatul initial
cu fgetcsv() (http://php.net/manual/en/function.fgetcsv.php) sa parsez informatia cum trebuie si sa pasez in flash. Totusi as prefera sa nu fie nevoie de asa ceva.

Solutia care am gasit-o momentan e sa folosesc ghilimele ca sa delimitez zonele cu "," care ar trebui evitate (ex. un, nume devine "un, nume"), pe urma, intainte sa sparg rand-ul pe campuri/elemente, inlocuiesc temporar virgula respectiva cu un simbol folosit mai rar. Pe urma pot fac split(",") si dupa ce am luat valorila inlocuiesc caracterul temporar cu "," iar:

Cod: Selectaţi tot
function reparaVirgula(text:String):String{
   var fq:Number = text.indexOf('"'),lq:Number;
   if(fq == -1) return text;
   else{
      lq = text.indexOf('"',fq+1);
      var f:String = text.substring(fq,lq);
      var r:String = f.split(",").join("±");
      return text.split(f).join(r);
   }
}
//in alta parte:
var valori:Array  = reparaVirgula(rand).split(",");



Legat de RegEx, ma gandeam la ceva asemanator cu http://stackoverflow.com/questions/7614877/regex-replace-the-first-comma-and-last-comma-from-the-csv-list-but-leave-the-m si http://mathfest.blogspot.co.uk/2010/03/regular-expressions-in-actionscript-2.html, dar e mai complicat decat ar trebui.
george.profenza
 
Mesaje: 57
Membru din: Mie Aug 13, 2008 11:42 am

Re: Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde Barna Biro » Dum Apr 29, 2012 5:07 pm

Mda, pacat ca nu te poti atinge de partea de server care genereaza .cvs-ul ( dar cum spunam, in functie de nevoi, poate nici nu era o solutie Ok - daca inlocuiai separatorul cu altceva si omul vroia sa deschida vreodata .cvs-ul in Excel si nu avea acelasi separator de system configurat ca si cel generat de tine atunci Excel nu ii split-uia valorile pe coloane ci fiecare rand era afisat in prima coloana ). Referitor la RegEx: nu prea este o solutie pentru ceea ce ai tu... structura ta de date este destul de diferita fata de cele ale omuletului de pe stackoverflow ( mult mai dinamica ); pentru situatia lui specifica ( mega-simpla ) merge si cu RegEx deoarece pattern-ul este static / fix.

Referitor la solutia aleasa de tine: Poti arata modelul curent din spatele .cvs-ului generat acuma si pentru care spui ca functioneaza solutia postata? Am o impresie ca se poate break-ui destul de usor si modelul curent ( sau daca nu, atunci poate se poate parse-ui un pic mai usor )... dar daca esti sigur ca utilizatorul nu va introduce explicit / voit ghilimele in valori ( gen "citat" ) atunci probabil lucrurile vor functiona oarecum Ok. :)

EDIT: Ai ceva de genul momentan? Deci valorile le pasezi la server cu ghilimele... is that correct sau n-am inteles bine ceea ce ai facut?

Cod: Selectaţi tot
var cvs:String =
"\"data\",\"nume\",\"descriere\"\n" +
"\"4/1/12\",\"nume 1\",\"bla bla bla\"\n" +
"\"4/2/12\",\"un, nume \",\"bla bla bla\"\n" +
"\"4/3/12\",\"nume 3\",\"bla bla bla\"";

var rows:Array = cvs.split("\n");
for (var i:Number = 0; i < rows.length; i++) {
   var columns:Array = rows[i].split("\"");
   for (var j:Number = 0; j < columns.length; j++) {
      if (columns[j] != "," && columns[j] != "") {
         trace("Row " + i + ": " + columns[j]);
      }
   }
}


Output scrie:Row 0: data
Row 0: nume
Row 0: descriere
Row 1: 4/1/12
Row 1: nume 1
Row 1: bla bla bla
Row 2: 4/2/12
Row 2: un, nume
Row 2: bla bla bla
Row 3: 4/3/12
Row 3: nume 3
Row 3: bla bla bla
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland

Re: Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde george.profenza » Dum Mai 06, 2012 8:45 pm

Merci Biro !

Am gasit o solutie care pune automat "" pentru valorile cu virgula: http://www.google.com/fusiontables
Totusi acum am dat de alta problema...totul merge ok local, dar nu pe server :(
Cod: Selectaţi tot
var t:TextField = _root.createTextField("t",1,10,10,200,200);
   t.border = t.multiline = t.wordWrap = true;
var lv:LoadVars = new LoadVars();
lv.onLoad = function(success:Boolean) {
    if (success) t.text = this.toString();
    else t.text = "Error loading/parsing LoadVars.";   
    trace(t.text);
};
lv.load("http://fusiontables.googleusercontent.com/fusiontables/api/query?sql=select%20*%20from%203685185%20");


Am incercat sa incarc datele din js si merge si local si pe server, deci banuiesc ca as putea sa folosesc
ExternalInterface sa pasez datele catre swf dupa ce s-au incarcat in js.

Banuiesc problema e din cauza asta: http://fusiontables.googleusercontent.com/crossdomain.xml
nu exista
Cod: Selectaţi tot
<allow-access-from domain="*"/>
, dar cumva sper sa fie o solutie din as (care sa nu
implice vreun script php care sa faca un cache pe server).

Idei ?
george.profenza
 
Mesaje: 57
Membru din: Mie Aug 13, 2008 11:42 am

Re: Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde Barna Biro » Lun Mai 07, 2012 8:51 am

Can spui ca "nu merge", ce se intampla exact? Primesti vreo exceptie la run-time? Primesti mereu 'null' in loc de datele asteptate? Serverul este pe acelasi domeniu cu aplicatia mereu? (ar putea fi si ceva de crossdomain ) Categoric ca ai putea sa faci cu combinatie de JavaScript doar ca ar fi un "hack" in cazul acesta... Incearca prima oara cu un crossdomain.xml, daca nu merge nici atunci, then please provide a bit more detailed info on the current problem (error stacks, etc.).
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland

Re: Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde george.profenza » Lun Mai 07, 2012 12:35 pm

Salut,

Daca rulez swf-ul local (fie in standalone player, fie in browser), totul merge ok.
Daca rulez swf-ul pe un server nu se incarca nimic (http status 0) :(

Am testat cu hack-ul din js si pe partea de actionscript am mult mai putin cod:
fac un call catre catre js sa incarc prin ajax/XTR datele; cand s-au incarcat
am un callback prin care le pasez in flash. Partea care-mi place e ca pot sa
cer datele in format json din js, trimit obiectul direct in as prin ExternalInterface
si ajunge tot ca obiect, nu ca String.

Ar fi f. misto sa pot sa fac treaba asta direct din as (sa pot incarc tabelul si in format JSON si pe server).
Anyway, partea cu status 0 suna a crossdomain, desi sper sa fie vreo solutie.
george.profenza
 
Mesaje: 57
Membru din: Mie Aug 13, 2008 11:42 am

Re: Cum pot evita probleme cu virgula in fisiere CSV ?

Mesajde Barna Biro » Lun Mai 07, 2012 4:02 pm

httpStatus = 0 in AS 3.0 cel putin in general inseamna ca URL-ul cu care incerci sa comunici nu exista / este gresit... verifica daca ai scris url-ul corect ( poate e un typo micut undeva sau pur si simplu este calea corecta altogether ). Probabil local ai serverul undeva dar online url-ul hardcodat de tine nu mai point-uie catre locatia adevarata al serverului.
Imagine
Avatar utilizator
Barna Biro
Administrator
 
Mesaje: 2037
Membru din: Vin Iul 25, 2008 1:06 am
Localitate: Lucerne, Switzerland


Înapoi la ActionScript 2.0

Cine este conectat

Utilizatorii ce navighează pe acest forum: Niciun utilizator înregistrat şi 2 vizitatori

cron