C# týden C# týden
Pořádné programy s pořádnou klávesnicí zdarma. Více zde
Pouze tento týden sleva až 80 % na C# .NET
Avatar
Filip Macháček:2.11.2018 16:11

Zdravím, potřebuji pomocí Splitu rozdělit string který je dělen desetinnou čárkou ale občas se v kódu vyskytne i uvozovka a v ní desetinné číslo a potřebuji aby se to v případě desetinného čísla nerozseklo
př.

nazev, popis, "20,8", KČ

Díky za rady ;-)

Chci docílit: aby se String nerozdělil na

[0] nazev
[1] popis
[2] "20
[3] 8"
[4] KČ

ale na
[0] nazev
[1] popis
[2] 20,8
[3] KČ

 
Odpovědět 2.11.2018 16:11
Avatar
Jirka
Člen
Avatar
Odpovídá na Filip Macháček
Jirka:2.11.2018 16:58

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*)");
Nahoru Odpovědět 2.11.2018 16:58
Kdo nic nedělá, nic nezkazí.
Avatar
Odpovídá na Jirka
Filip Macháček:2.11.2018 22:15

Bohužel, zde je výstup:

'nazev', ', ', 'popis', ', ', '"20', ',', '8"', ', ', 'KČ'
Editováno 2.11.2018 22:17
 
Nahoru Odpovědět 2.11.2018 22:15
Avatar
krepsy3
Redaktor
Avatar
krepsy3:2.11.2018 23:03

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.

Nahoru Odpovědět  +1 2.11.2018 23:03
Programátor je stroj k převodu kávy na kód.
Avatar
Jirka
Člen
Avatar
Odpovídá na Filip Macháček
Jirka:4.11.2018 13:03

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.

Nahoru Odpovědět 4.11.2018 13:03
Kdo nic nedělá, nic nezkazí.
Avatar
Jirka
Člen
Avatar
Odpovídá na Jirka
Jirka:4.11.2018 14:14

Na jiném .NET testeru nastala zase jiná chyba.

Nahoru Odpovědět 4.11.2018 14:14
Kdo nic nedělá, nic nezkazí.
Avatar
STP
Člen
Avatar
STP:6.11.2018 9:35

Co splitovat mezeru? Nepomohlo by?

Nahoru Odpovědět 6.11.2018 9:35
Když umřít, tak online!!!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:6.11.2018 11:39

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();
 
Nahoru Odpovědět 6.11.2018 11:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.