duplicitní řády v excelu   otázka

C#, ADO.NET, Databáze

Zdravím,

pomocí OleDb(connection,dataAdapter,command) nacitam z excelu tabulku do DataSetu (všechno je textově). Používám C#.

Potřeboval bych zjistit duplicitní řádky v zadaném sloupci a ty pak uložit do jiné tabulky.

Vygooglil jsem nějaký postup (http://www.kasman.sk/index.php?id_clanku... ale tam je sloupec ID, který já nemám, já tam mám jen samé texty.

díky

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Požadovaného výsledku můžete docílit buď příslušnou úpravou dotazu SQL objektu OleDbCommand, nebo můžete na již vybraných datech v tabulce (DataSet.Tables(0)) vyfiltrovat záznamy unikátní podle požadovaných kritérií pomocí dotazu LINQ:

Private Sub Form1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Click
  Dim dt As New DataTable()
  dt.Columns.Add("Name", GetType(String))
  dt.Columns.Add("Value", GetType(Integer))
  dt.Rows.Add("Ondřej", 0)
  dt.Rows.Add("Jan", 1)
  dt.Rows.Add("Ondřej", 2)
  Dim rows = From row As DataRow In dt.Rows Select row.Item("Name") Distinct
End Sub

Tento LINQ dotaz vybere všechny záznamy které mají unikátní sloupec Name a uloží je do kolekce IEnumerable(Of Object), která se dá procházet cyklem For Each.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já ale potřebuji přesný opak, z tabulky potřebuji dostat všechny duplicitní položky.

z tabulky:

name

jan

muf

tom

jan

oto

tom

potřebuji dostat tabulku:

name

jan

tom

jan

tom

nahlásit spamnahlásit spam 0 odpovědětodpovědět

a jak se toto dá udělat v C#?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

V čemkoliv vlastním algoritmem. Data čtu, minulý čtený záznam porovnám s aktuálním, při shodě stejné zkopíruji jinam.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Samozřejmě je třeba záznamy nejprve setřídit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

vlastní algoritmus samozřejmě mám hotový, ale chtěl jsem zjistit zda se to dá udělat nějakým SQL příkazem....

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Do přidaného sloupce dostat počet záznamů

daného jména a sloupec filtrovat s počtem

větším než jedna ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A šlo by to ukázat nějakým kódem? (pro nás co s začínáme z SQL)

dík

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je to jenom úvaha ;-),hotový kód není... :-(

Počet záznamů daného jména:

select count(sloupecjmeno) as kolikratjmeno

from seznamjmen where sloupecjmeno='jmeno'

Projít záznamy cyklem a do dalšího sloupce

např. datatable viz výše uložit výsledek

command.executescalar , 'jmeno' dosadit nebo

předat parametrem z aktuálního záznamu.

Filtrovat nejedinečné záznamy s počtem >1.

Někdo třeba poradí dostat to přímo do kritérií

dotazu jako poddotaz, pro nás co začínáme...

...

Přímo v excelu by to zvládnul vzorec

=COUNTIF(oblast ; kritérium)

ve sloupci vedle a automatický filtr! :-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem googlil a googlil až jsem spáchal tento kod:

Je to celkem dobrý, akorát ten výsledek bych potřeboval mít "distinct" podle row[xSortedColumn] a aby v něm byly všechny sloupce původní tabulky.

xTable.Columns.Add("duplicity", Type.GetType("System.Int32"));

            foreach (DataRow row in xTable.Rows)
            {
                int poc = (from r in xTable.AsEnumerable() where r[xSortedColumn].ToString() == row[xSortedColumn].ToString() select r).Count();
                row["duplicity"] = poc; 
            }

            var vysledek = (from row in xTable.AsEnumerable() where (int)row["duplicity"] > 1 orderby row["duplicity"] descending select row).Distinct();


nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem se konečně dobral nějakého řešení. Vygooglil jsem, že to půjde dělat v LINQu a ono to je (pro mě) překvapivě "jednoduchý", aspoň podle prvního dojmu z LINQu.

Kdyby to někoho zajímalo, tak tady je ta funkce:

        /// <summary>
        /// Vyhleda duplicity v tabulce.
        /// </summary>
        /// <param name="xTable">Tabulka, nad kterou se pracuje.</param>
        /// <param name="xSortedColumn">Sloupec, podle ktereho se hledaji duplicity.</param>
        /// <returns>Seznam radku puvodni tabulky, ktere maji duplicitni hodnoty ve sloupci xSortedColumn</returns>
        private static List<DataRow> Duplicities2(DataTable xTable, string xSortedColumn)
        {

            // vytvor tabulku duplicit
            DataTable table = new DataTable();
            table.Columns.Add(xSortedColumn, xSortedColumn.GetType());
            table.Columns.Add("Duplicities", Type.GetType("System.Int32"));

            // vyhledej a zapis pocty opakovani do tabulky duplicit
            DataRow dr;
            foreach (DataRow row in xTable.Rows)
            {
                int poc = (from r in xTable.AsEnumerable() where r[xSortedColumn].ToString().Equals(row[xSortedColumn].ToString()) select r).Count();
                //if (poc > 1)
                {
                    dr = table.NewRow();
                    dr[xSortedColumn] = row[xSortedColumn];
                    dr["Duplicities"] = poc;
                    table.Rows.Add(dr);
                }
            }

            // vyber radku z puvodni tabulky, ktere maji definovanou duplicitu
            IEnumerable<DataRow> tablePuvodni = xTable.AsEnumerable();
            IEnumerable<DataRow> tableDupl = table.AsEnumerable();

            var res = from c in tablePuvodni
                      join p in tableDupl on c[xSortedColumn].ToString() equals p[xSortedColumn].ToString()
                      where (int)p["Duplicities"] > 1
                      select c;

            return res.ToList<DataRow>();

        }

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback