none
Substring ou IndexOf RRS feed

  • Pergunta

  • Tenho 2 strings:

    string x = "FNJOSELNMARIA";
    string y = "FNANTONIOLNCARLOS";

    FN eh a sigla de First Name (nome)
    LN eh a sigla de Last Name (sobrenome)

    Preciso independentemente do tamanho do nome e sobrenome, ter:
    FN = JOSE
    LN = MARIA

    FN = ANTONIO
    LN = CARLOS

    Acontece que se uso IndexOf ou Substring, pelo tamanho ser variavel, acabo nao conseguindo setar a posicao inicial e tb, quantos caracteres pegar desde a posicao inicial uma vez que os nomes podem ter tamanhos diferentes.

    Qual seria a solucao ?
    Abracos

    segunda-feira, 2 de julho de 2018 18:55

Todas as Respostas

  • Partindo do principio que FN sempre virá primeiro, esse código pode te atender

    string x = "FNJOSELNMARIA";
    string y = "FNANTONIOLNCARLOS";
    var dadosMisturados = new[] { x, y };
    
    foreach (var dado in dadosMisturados)
    {
        var nomes = dado.Replace("FN", "").Replace("LN", ";").Split(';');
        Console.WriteLine($"{nomes[0]} {nomes[1]}");
    }


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    segunda-feira, 2 de julho de 2018 19:25
  • O problema eh que as vezes, FN vem depois de LN.

    E dai, como poderia ser feito ?

    terça-feira, 3 de julho de 2018 14:56
  • Bom, para situações um pouco mais complexas como a tua, recomendo utilizar Regex, pois dependendo da massa de dados, fazer Substring, indexof vai onerar a performance de sua aplicação.

    Segue o código com Regex

    // Regex - https://regex101.com/r/fY6oCF/1
    var dadosMisturados = new[] { "FNJOSELNMARIA", "FNANTONIOLNCARLOS", "LNSILVAFNJOSE", "LNMOROFNSERGIO" };
    foreach (var dado in dadosMisturados)
    {
        var primeiroNome = Regex.Match(dado, "(?<=FN)(.*(?=LN)|(.*(?=$)))", RegexOptions.IgnoreCase).Value;
        var sobrenome = Regex.Match(dado, "(?<=LN)(.*(?=FN)|(.*(?=$)))", RegexOptions.IgnoreCase).Value;
        Console.WriteLine($"{primeiroNome} {sobrenome}");
    }

    Para entender o Regex efetuado veja aqui: Regex101

    O que eu fiz de diferente no Regex foi utilizar PositiveLookAhead e PositiveLookBehind


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    terça-feira, 3 de julho de 2018 16:31
  • Aqui so tenho 2 campos.

    Mas digamos que ao inves de FN e LN, eu tenha 30 campos, eu teria que colocar todos os campos em cada linha?

    Regex.Match(dado, "(?<=FN)(.*(?=LN)|(.*(?=$)))",


    terça-feira, 3 de julho de 2018 18:21
  • AGA Neto,

    Se você tiver um arquivo que em cada linha possui 30 campos e os identificadores de cada campo não estão numa ordem fixa. Em uma linha FN está antes de LN. Em outra linha LN antes de FN.

    A resposta é sim, para cada linha um regex.

    Há alternativas para outros cenários, existem abordagens mais efetivas se o arquivo possui um padrão seja um delimitador, tamanho fixo ou com um identificador, como o seu, mas com uma ordem fixa.

    No seu cenário (Campos fora de ordem), acredito que Regex não é só o melhor caminho, como o mais viável, pois Substring e IndexOf não serão nada práticos se os campos não estiverem ordenados.

    Se você colocar mais detalhes do teu cenário, podemos pensar em um caminho juntos.


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br



    • Editado Bruno Brito terça-feira, 3 de julho de 2018 18:41
    terça-feira, 3 de julho de 2018 18:33
  • Infelizmente os campos variam muito e nao tem um delimitador ou tamanho fixo.

    Entao vamos supor que em um cartao eu tenha:

    Nome, sobrenome, data nascimento, numero registro, endereco1, endereco2, bairro, cidade, estado, sp, tipo sanguineo e todos esses campos podendo varias em ordem.

    Essa eh a dificuldade

    terça-feira, 3 de julho de 2018 18:42
  • Se você ir pelo caminho do Regex, vai chegar ao resultado final com qualidade e performance.

    Regex são monstrengos feios, mas extremamente eficientes.


    Espero ter ajudado! Se consegui, não esquece de marcar no fórum como útil! Obrigado :)
    #fullstack dev - MCSA, MCTS and actually blogging at www.saindodacaixinha.com.br

    terça-feira, 3 de julho de 2018 19:07