Diskuze: Split
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj.
Myslím, že by to šlo udělat RegExem. Něco jako:
string zdroj = "nazev, popis, \"20,8\", KČ";
string[] vysledek = Regex.Split(zdroj, @"(\\"[0-9]+([\.\,][0-9]+)?\\"|[\.\,]\s*)");
Bohužel, zde je výstup:
'nazev', ', ', 'popis', ', ', '"20', ',', '8"', ', ', 'KČ'
Já bych se s tím nebabral. Prostě bych to rozdělil klasicky splitem a pak to iteroval:
string[] presplit = "nazev,popis,\"20,8\", KČ".Split(',');
List<string> split = new List<string>();
bool detected = false;
foreach(string s in presplit)
{
if (detected)
{
split[split.Length - 1] += ("," + s);
detected = false;
continue;
}
split.Add(s);
if (s.StartsWith("\"") detected = true;
}
Upozorňuji, že jsem kód psal na mobilu a z hlavy.
Ahoj,
promiň za předchozí chybu.
Tak nakonec jsem získal a otestoval následující RegEx:
string zdroj = "nazev, popis, \"20,8\", KČ";
string[] vysledek = Regex.Split(zdroj, @"((?<![0-9])\s*[\.\,]\s*)");
Doufám, že jsem pomohl.
To je pravdepodobne csv format a ridi se urcitymi pravidly.
Cili, na csv format musis mit csv parsovac.
google = net csv parse
https://stackoverflow.com/…ons-with-net
Jestli si to chces napsat sam, tak nebranim.
, = oddelovac sloupcu
\n = oddelovac radku (novy radek)
" = znak, kterym se escapuje
"text" = sloupec, ktery obsahuje text se znaky, ktere je treba escapovat
" = escapovany znak
\n = escapovany znak (novy radek)
, = escapovany znak
Kdyz ten string vytvaris, tak pseudokod vypada asi takto:
cols[] = escapeCol(str);
rows[] = cols.join(",");
out = rows.join("\n");
function escapeCol(str)
{
bool = str.obsahuje_znaky(, " \n)
if (bool==false) return str;
return " + escapeChars(str) + "
}
Zpetny dekoder primitivnim reg. vyrazem neudelas
google = reg exp csv parse
V js ten dekoder vypada asi takto
function isExist(item) {return typeof(item)!=='undefined' && item!=null;}
function isObject(item) {return typeof(item)=='object' && item!=null;}
function isFunction(item) {return typeof(item)=='function' && item!=null;}
function escapeRegexp(str)
{
var reg, symbols;
patt = ('(['+'\\^$*+?.()|{}[]'.split('').join('\\'))+'])';
reg = new RegExp(patt,'g');
//alert(str)
return str.replace(reg,'\\$1');
}
function classCsv(csv)
{
this.opt;
this.data;
//this.csv = {};
//this.csv_r = {};
this.init = function(opt)
{
var p = {};
this.opt = {};
this.opt.parse = {
row : "\n", // row separator
col : ';', // col separator
enc : '"', // enclosure string
esc : '"' // escape csv chars in string
}
this.data = {};
this.data.patt = {};
if (isExist(opt) && isObject(opt))
{
for (i in this.opt.parse)
{
this.opt.parse[i] = isSet(opt,i) && isString(opt[i]) ? opt[i] : this.opt.parse[i];
}
}
for (i in this.opt.parse)
{
p[i] = escapeRegexp(this.opt.parse[i]);
}
p.val_enc = '([' + p.enc + '])';
p.val_sep = '[' + p.col + p.row + ']';
p.imp1 = p.esc + p.enc;
p.imp2 = "(" + p.col + "|\\r?" + p.row + "|\\r|^)" + // Delimiters
"(?:" + p.enc + "([^" + p.enc + "]*(?:" + p.imp1 + "[^" + p.enc + "]*)*)" + p.enc + "|" + // Quoted fields
"([^"+ p.enc + p.col + "\\r" + p.row + "]*))" // Standard fields
this.data.patt = p;
}
this.init();
this.escapeCsvValue = function(str,escape_always)
{
var reg, patt, repl, csv, csv_patt;
csv = this.opt.parse;
patt = this.data.patt;
str = str + ''; //convert to string
re = new RegExp(patt.val_enc,'g');
str = str.replace(re,csv.esc + '$1');
re = new RegExp(patt.val_sep,'g');
str = escape_always==true || str.search(re)!=-1 ? csv.esc + str + csv.esc : str;
// ignore RFC 4180
return str;
}
this.export = function(arrData,escape_always)
{
var i, row, csv, out;
var escape_always = typeof escape_always=='undefined' ? false : escape_always;
csv = this.opt.parse;
out = [];
for (i=0; i<arrData.length; ++i)
{
row = arrData[i];
for (j=0; j<row.length; ++j)
{
row[j] = this.escapeCsvValue(row[j],escape_always);
}
out[i] = row.join(csv.col);
}
return out.join(csv.row);
}
this.import = function(strData,cb_escape)
{
var out, arrMatches, strMatchedDelimiter, strMatchedValue, re1, re2, bool;
csv = this.opt.parse;
patt = this.data.patt;
bool = isFunction(cb_escape);
re1 = new RegExp(patt.imp2, "gi");
out = [[]];
arrMatches = null;
while (arrMatches = re1.exec( strData ))
{
strMatchedDelimiter = arrMatches[ 1 ];
if (strMatchedDelimiter.length && strMatchedDelimiter !== csv.col)
{
out.push([]);
}
if (arrMatches[ 2 ])
{
re2 = new RegExp( patt.imp1, "g" );
strMatchedValue = arrMatches[ 2 ].replace(re2, csv.enc);
}
else {
strMatchedValue = arrMatches[ 3 ];
}
strMatchedValue = typeof(strMatchedValue)!='undefined' ? strMatchedValue + '' : '';
strMatchedValue = bool ? cb_escape(strMatchedValue) : strMatchedValue;
out[out.length-1].push(strMatchedValue);
}
return out;
}
}
CSV = new classCsv();
Zobrazeno 8 zpráv z 8.