C# Split függvény pontosan hogy?

C# Split függvény pontosan hogy?
2009-12-07T19:22:05+01:00
2009-12-10T17:52:34+01:00
2022-11-15T23:35:37+01:00
mark008
Sziasztok!

Van egy .csv fájlom, amiben ilyen jellegű sorok vannak:

5,3,11,4748

Ez valójában három szám, 5, aztán 3,11, aztán pedig 4748. Az összes sor így néz ki, és azt szeretném csinálni, hogy az összes első számot betölteni egy dataGridView első oszlopába, az összes második számot a második oszlopba, és az összes harmadik számot a harmadik oszlopba. Azt tudom, hogy ezt a Split függvénnyel kellene valahogy megoldani, de nem tudom, hogy pontosan hogy kellene beállítani, hogy pontosan kiszedje az első számokat, majd a második számokat, amik egyébként mind tizedes törtek, illetve a harmadik számokat. Illetve az sem világos teljesen jelenleg, hogy hogyan tudom ezeket rögtön be is tölteni a dataGridViewba. Előre is köszönök minden segítséget.
Mutasd a teljes hozzászólást!
String sor; String[] részek; részek = sor.Split(',');
Ezt egy ciklussal úgy töltöd be oda ahova és ahogy csak akarod.
Mutasd a teljes hozzászólást!


  • String input = "5,3,11,4748"; String[] darabok; darabok = input.Split(','); int elso = int.Parse(darabok[0]); string kozep = darabok[1] + "," + darabok[2]; double kozepdouble = double.Parse(kozep); int harmadik = int.Parse(darabok[3]); Console.WriteLine("{0} {1} {2}",elso,kozepdouble,harmadik);

    Ez minden input sorra, és kész. Sajnos ha a splitnek nem lehet megmondani, hogy "ugorja át" a második "," karaktert :)

    Lehetne még IndexOf és társaival játszani, de az sokkal macerásabb :)
    Mutasd a teljes hozzászólást!
  • Üdv!

    Nem biztos, hogy a legjobb megoldás, de próbáld így:


    private void Form1_Load(object sender, EventArgs e) { LoadData(); } private void LoadData() { string elvalaszto = ","; string tablaneve = "Proba"; string file = "proba.csv"; string[] itemek; DataSet ds = new DataSet(); StreamReader sr = new StreamReader(file); ds.Tables.Add(tablaneve); ds.Tables[tablaneve].Columns.Add("szam1"); ds.Tables[tablaneve].Columns.Add("szam2"); ds.Tables[tablaneve].Columns.Add("szam3"); string mindenadat = sr.ReadToEnd(); string[] sorok = mindenadat.Split("\r".ToCharArray()); foreach (string r in sorok) { itemek = r.Split(elvalaszto.ToCharArray()); string item1 = itemek[0]; string item2 = itemek[1] + "," + itemek[2]; string item3 = itemek[3]; string ossze = item1 + "|" + item2 + "|" + item3; string[] egysorba = ossze.Split(new char[] { '|' }); ds.Tables[tablaneve].Rows.Add(egysorba); //ds.Tables[tablaneve].Rows.Add(item2); } this.dataGridView1.DataSource = ds.Tables[0].DefaultView; }

    Üdv,
    Mutasd a teljes hozzászólást!
  • És mennyivel egyszerűbb volna az élet ha a listaelválasztó nem vessző, hanem mondjuk egy pontosvessző lenne.... ez így nem csv!
    A csv-ben egyértelmű a mezőhatároló.
    Vagy használj tizedes pontot, vagy pontosvesszőt szeparátornak, és a split is kiválóan fog működni.
    Gondolom a csv-nek titulált file-t i svalaki vagy valami létrehozza, na ott kell beavatkozni, minden más csak taknyolás lesz.
    Mutasd a teljes hozzászólást!
  • Köszönöm a segítséget, ez jól működik, illetve működne, ha a kérdéses fájlok nem olyanok lennének, hogy WriteLine-al vannak beleírva a sorok, vagyis van egy utolsó üres sor mindegyikben, és ott emiatt elszáll a szétbontás. Ezzel mit lehetne kezdeni? Illetve az összes fájl első sora olyan, ami nem kell, azt hogy lehetne kivenni belőlük, hogy a dataGridView-ban már ne legyenek benne? De egyébként ez a megoldás gond nélkül működött, amikor kiszedtem az "üres sort" a fájlból.
    Mutasd a teljes hozzászólást!
  • Üdv,

    Az alábbi részét a kódnak,

    foreach (string r in sorok) { itemek = r.Split(elvalaszto.ToCharArray()); string item1 = itemek[0]; string item2 = itemek[1] + "," + itemek[2]; string item3 = itemek[3]; string ossze = item1 + "|" + item2 + "|" + item3; string[] egysorba = ossze.Split(new char[] { '|' }); ds.Tables[tablaneve].Rows.Add(egysorba); //ds.Tables[tablaneve].Rows.Add(item2); }

    cseréld ki erre:


    for (int i = 1; i < sorok.Count(); i++) { itemek = sorok[i].Split(elvalaszto.ToCharArray()); if (itemek.Length > 1) { string item1 = itemek[0]; string item2 = itemek[1] + "," + itemek[2]; string item3 = itemek[3]; string ossze = item1 + "|" + item2 + "|" + item3; string[] egysorba = ossze.Split(new char[] { '|' }); ds.Tables[tablaneve].Rows.Add(egysorba); } }

    Valóban, az elválasztó vessző helyett, jobb lenne ha pontosvessző lenne!

    Üdv.
    Mutasd a teljes hozzászólást!
  • Köszönöm az újabb segítséget, de erre sajnos azt mondja, hogy a "sorok"-hoz nem tartozik a "Count"-ra definíció. Az elválasztót egyébként lecseréltem pontosvesszőre, így tényleg sokkal jobb.
    Mutasd a teljes hozzászólást!
  • Hát azért ez kicsit ütős volt. Erre amúgy magadtól is rájöhetnél:
    sorok.Length
    ha már tömbről van szó ugye...
    Mutasd a teljes hozzászólást!
  • Ha ezt írod: sorok.Count(),(a Count mögött "()" van) akkor mennie kell, mert nálam nem dobott hibát. Egyébként a sorok.Length a megfelelő.

    Üdv,
    Mutasd a teljes hozzászólást!
  • Köszönök minden segítséget, most már hibátlanul működik az egész.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd