Wątek przeniesiony 2015-03-17 11:13 z C/C++ przez Shalom.

C#. Porównanie danych w stringach

0

Witam.
Mam spory problem z którym nie mogę dojść do ładu. Może opiszę wszystko po kolei. Posiadam połączenie z serwerem baz danych i zachowuje sobie w "Zmiennych" nazwy tabel, kolumn i różne inne potrzebne mi dane. Dla uproszczenia podam jak to wygląda na przykładzie:

  1. zapisane nazwy tabel moge miec (w sumie w 3 wersjach):

z distinctem:

string tabSQL = test, test2, t3, t4, t5
string tabXML = test, t3, t5, t6

bez:

//dokladnie tyle ile jest kolumn, jest to zasluga selecta.
string tabSQL = test test test test test2 t3 t3 t3 t4 t5 t5 t5 //12
string tabXML = test test test t3 t3 t3 t5 t5 t6 //9

lub z ich odpowiadającymi kolumnami - punkt 3

  1. zapisane nazwy kolumn:

string kolSQL = dan1 dan2 dan3 dan4 dan1 dan1 dan2 dan3 dan1 dan2 dan3 dan4 //12
string kolXML = dan2 dan3 dan5 dan1 dan2 dan3 dan2 dan3 dan1 //9

  1. mozna zapisac rownie dobrze w jednym stringu nazwe tabeli z odpowiadajaca jej kolumną, wtedy stringi beda wygladaly tak jak w Query:

string tabkolSQL =

test dan1
test dan2
test dan3 wyswietlamy poniewaz rozni sie - zawiera dan4 i nie zawiera dan5 z tabkolXML
test dan4

test2 dan1 pomijamy poniewaz nie wystepuje w tabkolXML

t3 dan1
t3 dan2 pomijamy poniewaz posiada identyczne nazwy tabel jak tabkolXML
t3 dan3

t4 dan1 pomijamy poniewaz nie wystepuje w tabkolXML

t5 dan2
t5 dan3 wyswietlamy poniewaz rozni sie - zawiera dan4, ktorej nie ma w tabkolXML
t5 dan4

string tabkolXML =

test dan1
test dan2 wyswietlamy poniewaz rozni sie - zawiera dan5 i nie zawiera dan4 z tabkolSQL
test dan5

t3 dan1
t3 dan2 pomijamy poniewaz posiada identyczne nazwy tabel jak tabkolSQL
t3 dan3

t5 dan2
t5 dan3 wyswietlamy poniewaz rozni sie - nie zawiera dan4 z tabkolSQL

t6 dan1 pomijamy poniewaz nie wystepuje w tabkolSQL

Ale wydaje mi się, że tak zapisane ciężej będzie porównać?
----------------- Btw. kresek nie wyświetlam, dodałem tutaj żeby było lepiej widać :P

  1. Z założenia:

if tabSQL.Contains(tabXML) // w wyniku powinny być nazwy tabel: test, t3, t5 poniewaz sie powtarzają - to działa
kolumn1 != kolum2 // tutaj ma spr różnice w kolumnach dla odpowiadających im tabel, jesli są to wynik - z tym mam problem
wynik = tab1 // wynik powinien byc nazwami tabel w ktorych sie roznia kolumny

w tym wypadku: wynik = test, t5

  1. Nazwy wyciągam w ten sposób:
                    SqlCommand cmd = new SqlCommand();
                    SqlDataReader reader;

                    cmd.CommandText = "Use " + comboBox3.Text + "; select TABLE_NAME, COLUMN_NAME from information_schema.columns;";
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = Connection.myConnection;
                    reader = cmd.ExecuteReader();

                    string columSQL = "";
                    string tablSQL = "";
                    int SQLcount = 0;

                    while (reader.Read())
                    {
                        tablSQL += reader.GetString(0) + "\n";
                        columSQL += reader.GetString(1) + "\n";
                        //columSQL += reader.GetString(0) + "\n";
                        SQLcount += 1;
                    }
                    reader.Close(); 

Następnie rozbijam splitem dla porównań (a w razie potrzeby jeśli nie chce powtórzeń dokładam Distinct):

                    var kolSQL = columSQL.Split('\n'); //kolumny
                    var tabSQL = tablSQL.Split('\n'); //tabele

                    var kolXML = columXML.Split('\n'); //kolumny
                    var tabXML = tablXML.Split('\n'); //tabele
  1. Funkcja nad którą pracowałem do tej pory (tak wiem, że nie działa :P - dodaje mimo wszystko też nazwy tabeli których kolumny są takie same):
                   for (int i = 0; i < SQLcount; i++)
                    {
                        for (int j = 0; j < XMLcount; j++)
                        {
                            if (tabSQL[i].Contains(tabXML[j]))
                            {
                                if (kolSQL[i] != kolXML[j])
                                {
                                    richTextBox3.Text += "Tabela: " + tabSQL[i] + "\n";
                                }
                            }
                        }
                    }

Nie mogę rozkminić na mój ciasny rozumek jak to powinno wyglądać :P Bardzo proszę o jakąś pomoc, może kodzik na podstawie którego ruszę dalej, gdyż podobnych funkcji będę potrzebował jeszcze kilka sobie zrobić.

0

Nic nie rozumiem.

zachowuje sobie w "Zmiennych" nazwy tabel, kolumn i różne inne potrzebne mi dane

W jaki sposób je sobie zachowujesz? Skąd ktoś ma to wiedzieć?

string s1 = "dbo.tab1: test, test2, t3, t4, t5" 
string s2 = "dbo.tab2: test, t3, t5, t6'  
//tak to wygląda?

tabSQL, tabXML, kolSQL,kolXML To są rozumiem jakieś tablice?

A już kompletnie nie rozumiem co trzeba wpisywać do richtextboxa.

Po co w ogóle trzymasz tak nazwy kolumn i tabel?

0

Napisałem w @add jak je zachowuje - While(reader.Read()) z selecta
tablSQL - nazwy tabel, w tym wypadku "test \n test2 \n t3 \n t4 \n t5" z distinctem, lub powielone bez.
kolSQL - nazwy kolumn, wszystkich imho, bo wszystkie się ładują.

Wrzuć do query formułkę "Use dbo.JakiesTam; select TABLE_NAME, COLUMN_NAME from information_schema.columns;" to zobaczysz jak to dokładnie wygląda.

Trzymam je tak żeby je wyświetlić. A potem móc porównać - jak w "Założeniu".

0

Nie zauważyłem edita.
Pokaż dla przykładowych danych jaki powinien być output.

0

@up

Ktoś coś, może? :)

0

Widocznie nikt nie rozumie co ty chcesz zrobić. Pisałem podaj przykładowe dane wejściowe i wyjściowe. np

//input 
string[] tabsql = {"t1","t2","t3","t4","t5"};
string[] kolsql = {"col1","col2","col3"};
//output
string[] result = {???}
0

Podałem w punktach 1, 2, 3 i 4 :P
Pkt 3 - przykładowe dane wejściowe jak wygladaja kolo siebie + pkt 4 - co wychodzi i co ma wyjść :P

//input
string tabSQL = test test test test test2 t3 t3 t3 t4 t5 t5 t5 //12
string tabXML = test test test t3 t3 t3 t5 t5 t6 //9

string kolSQL = dan1 dan2 dan3 dan4 dan1 dan1 dan2 dan3 dan1 dan2 dan3 dan4 //12
string kolXML = dan2 dan3 dan5 dan1 dan2 dan3 dan2 dan3 dan1 //9

//output
string output = test, t5

Jak ja to rozumuje:

if tabSQL = tabXML //w wyniku powinny być nazwy tabel ktore sie powtarzaja w tabSQL i tabXML
if kolSQL != kolXML // tutaj ma spr różnice w kolumnach dla odpowiadających im tabel, jesli są to wynik
output = tabSQL // no i ma wypisać te tabSQL (lub tabXML to nie robi w tym momencie roznicy) dla ktorych kolSQL jest rozny od kolXML

@add
Może jest jakiś lepszy sposób na porównywanie baz danych / tabel / kolumn / typów danych w C# niż wyciąganie komendami, cięcie stringów i porównywanie w pętlach? :P

0

A nie mozna tego zrobic tak po ludzku na obiektach? Zeby dalo to sie chociaz czytac normalnie? W tej chwili kompletnie nie wiem co to ma robic;p

0

@up wszystko można :P
Ma sprawdzać czy kolumny się różnią dla tabel o tej samej nazwie - prościej nie da się tego określić :P

0

No to jeśli ma sprawdzać czy się Tabele różnią:

class Table
{
    public List<string> Columns { get; private set; }

    public Table(IEnumerable<string> columns)
    {
        Columns = columns.ToList();
    }

    public override bool Equals(object obj)
    {
        var table = obj as Table;
        if (table == null)
            return false;
        if (Columns.All(c => table.Columns.Contains(c)))
            return true;
        return false;
    }
}

//później tworzysz takie obiekty
var t1 = new Table(new[]{"t1","t2","t3","t5"});
var t2 = new Table(new[]{"t1","t2","t1","t3"});
// i mozesz je porównać
bool areEqual = t1.Equals(t2);
0

Dla dwóch tabel to jest kinda easy, zrobiłem też kinda po swojemu i działa (już nie kinda :P).

Nie działa mi porównanie jeśli wczytuje wszystkie tabele i wszystkie kolumny z bazy i musze porównać w tabelach o tych samych nazwach, że kolumny się różnią i wypisać te tabele.

1 użytkowników online, w tym zalogowanych: 0, gości: 1