Předvánoční Black Friday Předvánoční Black Friday
Až 80% zdarma! Předvánoční BLACK FRIDAY akce. Více informací

Diskuze: Split

C# .NET .NET (C# a Visual Basic) Split American English version English version

Aktivity (3)
Avatar
Filip Macháček:2. listopadu 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. listopadu 16:11
Avatar
Jirka
Člen
Avatar
Odpovídá na Filip Macháček
Jirka:2. listopadu 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. listopadu 16:58
Kdo nic nedělá, nic nezkazí.
Avatar
Odpovídá na Jirka
Filip Macháček:2. listopadu 22:15

Bohužel, zde je výstup:

'nazev', ', ', 'popis', ', ', '"20', ',', '8"', ', ', 'KČ'
Editováno 2. listopadu 22:17
 
Nahoru Odpovědět 2. listopadu 22:15
Avatar
krepsy3
Redaktor
Avatar
krepsy3:2. listopadu 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. listopadu 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. listopadu 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. listopadu 13:03
Kdo nic nedělá, nic nezkazí.
Avatar
Jirka
Člen
Avatar
Odpovídá na Jirka
Jirka:4. listopadu 14:14

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

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

Co splitovat mezeru? Nepomohlo by?

Nahoru Odpovědět 6. listopadu 9:35
Když umřít, tak online!!!
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:6. listopadu 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. listopadu 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.