java porównanie stringów

0

Cześć, napotkałem na taki problem,
Pobieram plik z tabelą w formacie .csv, nastęonie odczytuję go poprzez CSVRearer z zastosowaniem wybranego prze zemnie separatora.
Dane potrafie wyświetlić, ale nie chcą mi się porównać.
Dane z bazy to login i hasło, takie same dane wprowadzam w dwa pola i zapisuję do zmiennej jako string.
Dlaczego String z pliku .csv nie chce się porównać ze stringiem z pola tekstowego?

    String user = "";
    String pass = "";
    boolean logOk = false;
    public void logowanie(View v) {
        logOk = false;
        EditText et1 = findViewById(R.id.enterUser);
        user = et1.getText().toString();
        EditText et2 = findViewById(R.id.enterPass);
        pass = et2.getText().toString();
        
        new importBazyUser().execute();
    }

ponoć powinno to być zapisane tak " if(user.equals(userBase))", ale nie działa to ani if(user == userBase)

private class importBazyUser extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... strings) {
            tagInfoBGW = "start logowania" + "\n";
            try {
                tagInfoBGW += "test importu bazy danych" + "\n"; //raportowanie
                File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
                File imgFile = new File(path, "/ftp/bazy/userapk.csv");
                testNadaniaUprawnien();
                CSVReader reader = new CSVReader(new FileReader(imgFile), '^');
                String[] nextLine;
                while ((nextLine = reader.readNext()) != null) {
                   String userBase = nextLine[0].toString();
                    if(user.equals(userBase)) {
                        tagInfoBGW += "user ok: " + user + " / " + userBase + "\n"; //raportowanie
                    } else {
                        tagInfoBGW += "user er: " + user + " / " + userBase + "\n"; //raportowanie
                    }
                }
                tagInfoBGW += "baza zaimportowana" + "\n"; //raportowanie
            } catch (IOException e) {
                tagInfoBGW += "error " + e.toString() + "\n"; //raportowanie
            }
            return tagInfoBGW;
        }
    }
0

No dobra, ale co tam ci zaraportowało w tagInfoBGW? Przecież tam powinieneś mieć informację jak wygląda user i userBase

0

Obojętnie czego nie zrobię zawsze jest taka sama odpowiedz:

user er: user1 / user1
user er: user1 / admin

Czyli nie wykrył że pierwsze zestawienie jest prawidłowe.

0

Zamień " + user + " / " + userBase + "\n" na [" + user + "] / [" + userBase + "]\n". Musisz mieć pewność że zobaczysz miałe znaki

0

user er: [user1] / [user1]
user er: [user1] / [admin]

no właśnie w tym sęk że nic mi to nie daje, wygląda że stringi są poprawne, nie wiem w czym może być problem.

A nextLine[0] nie musi być jakoś inaczej prze konwertowane na String?

2

@AnyKtokolwiek: dobrze pisze - debuger. Ustaw pułapkę na bodaj 12 linii i sobie pomału pykaj do przodu. Będziesz widział co porównujesz z czym.

0

No ok, debugger już już odpaliłem, zrobiłem to na linii z if, i jest coś co jest dla mnie totalnie nie logiczne, wychodzi na to że :

(zmieniłem nazwę użytkownika)
zmienna z userBase = "dzmtosu" = count = 17
zmienna z user = "dzmtosu" = count = 14

czyli jak mam rozumieć dla javy dwa stringi mają inną długość...
I rozumiem że dla kogoś z Was jest to logiczne i oczywiste...

P.S. AnyKtokolwiek troszkę to mało powiedziane, po wielu latach pisania w vb.net to to dla mnie chinski od tyłu.

0

Zrzut ekranu (8).png

2

Dla pewności wyświetl wszystkie bajty. Możesz mieć gdzieś nulla (w sensie znak 0x00, który według standardu jest niewidocznym znakiem, tzn. nie widać go w ogóle). Zamiast userBase wypisz Arrays.toString(userBase.getBytes("UTF-8")).

Do porównywania możesz użyć string1.trim().equals(string2.trim()) (zamiast zwykłego string1.equals(string2)), ale raczej lepiej poprawić wczytywanie lub zawartość pliku.

0

to samo, w opcji 1 i 2 taki sam wynik.
Jakaś miazga z tym jest... bardziej skomplikować się tego języka już nie dało?

3

Jak to samo? Miałeś wypisać bajty.

Zamień " + user + " / " + userBase + "\n" na " + Arrays.toString(user.getBytes("UTF-8")) + " / " + Arrays.toString(userBase.getBytes("UTF-8")) + "\n".

Poza tym, znalazłem pewną informację na temat tego count: https://stackoverflow.com/a/53776680

2

Te stringi nie są takie same. Gdyby były, to porównanie zwróciłoby true. Teraz 10 osób przez 5 stron tematu będzie ci tłumaczyć jak postawić breakpointa i podejrzeć zawartość zmiennej, ale moim zdaniem jeśli to cię przerasta, to nie powinieneś zajmować się programowaniem bo to cię przerasta.

3

Readery w Javie czasem trzeba opanować co do strony kodowej, i to jest ten przypadek

Nie wiem czego używasz do CSV (CSVReader), ale pewnie tam są jakieś uproszczenia / syfki.
A i my nie wiemy, w jakiej jest ten plik z ftp

0

Ok, jak na razie przebudowałem aplikację generujące bazy w .csv i dodają jeszcze jeden separator przed wierszem.
Czytam po prostu z drugiej kolumny i wszystko działa, dzięki za pomoc i poświęcony czas.
Ghost_ zostaje zwycięzcą dzisiejszego odcinka i otrzymuję talon na balon.

Pozdrawiam.

2

Wygląda na to, że te 3 bajty na początku to https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8 i po zdekodowaniu tego wychodzi https://stackoverflow.com/questions/9691771/why-is-65279-appearing-in-my-html Znacznika BOM jednak nie powinno się dekodować jako znaku. Trzeba go wykryć i pominąć w przypadku UTF-8, bo w UTF-8 znacznik BOM nic nie robi. Możesz też ustawić swój edytor tak, by nie dodawał tego BOM w UTF-8.

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