none
FILTRAR ACESSOS RRS feed

  • Pergunta

  • Tenho acessos coletados que estão em um arquivo de texto do seguinte modo

    Pessoa_id data hora

    1 20/11/2016 09:30 1 20/11/2016 12:00 1 20/11/2016 13:00 1 20/11/2016 18:30 4 20/11/2016 08:30 4 20/11/2016 12:01 4 20/11/2016 13:10 4 20/11/2016 18:00

    Quero criar um programinha no c# que faz o seguinte pra mim, recebe o arquivo de texto e filtrar pagando somente a primeira e a ultima batida do dia e depois disto ele me gera outro arquivo de texto somente com a primeira e a ultima batida do dia de cada pessoa

    Atenciosamente,
    José Henrique Sabino

    segunda-feira, 21 de novembro de 2016 11:37

Respostas

  • Cara acredito que aqui vc vai encontrar respostas especificas em T-SQL , tem um fórum próprio   para implementações em C#

    Link: https://social.msdn.microsoft.com/Forums/pt-BR/home?forum=vscsharppt

    acredito que seu problema em T-SQL resolva assim ,para SQL-Server 2012

    DECLARE @table TABLE (id INT ,dataAcesso VARCHAR(MAX) ,horario VARCHAR(5))

    INSERT INTO @table
            ( id, dataAcesso, horario ) VALUES  ( 1,'20/11/2016', '09:30' )
        ,( 1,'20/11/2016', '12:00' )
    ,( 1,'20/11/2016', '13:00' )
    ,( 1,'20/11/2016', '18:30' )
    ,( 4,'20/11/2016', '08:30' )
    ,( 4,'20/11/2016', '12:01' )
    ,( 4,'20/11/2016', '13:10' )
    ,( 4,'20/11/2016', '18:00' );
     


     WITH   Dados
              AS ( SELECT   T.id ,
                            T.dataAcesso ,
                            T.horario,
    PrimeiroAcesso = FIRST_VALUE(t.horario) OVER(PARTITION BY T.id ORDER BY T.id),
    UltimoAcesso = LAST_VALUE(t.horario) OVER(PARTITION BY T.id ORDER BY T.id)
                   FROM     @table AS T
                 )
        SELECT  Dados.id ,
                Dados.dataAcesso ,
                Dados.horario,
    Dados.PrimeiroAcesso,
    Dados.UltimoAcesso
        FROM    Dados
    WHERE Dados.horario = Dados.PrimeiroAcesso 
    ORDER BY Dados.id



    Wesley Neves


    • Editado Wesley Neves segunda-feira, 21 de novembro de 2016 12:38 correção
    • Marcado como Resposta Xarp2 segunda-feira, 21 de novembro de 2016 13:22
    segunda-feira, 21 de novembro de 2016 12:32

Todas as Respostas

  • Cara acredito que aqui vc vai encontrar respostas especificas em T-SQL , tem um fórum próprio   para implementações em C#

    Link: https://social.msdn.microsoft.com/Forums/pt-BR/home?forum=vscsharppt

    acredito que seu problema em T-SQL resolva assim ,para SQL-Server 2012

    DECLARE @table TABLE (id INT ,dataAcesso VARCHAR(MAX) ,horario VARCHAR(5))

    INSERT INTO @table
            ( id, dataAcesso, horario ) VALUES  ( 1,'20/11/2016', '09:30' )
        ,( 1,'20/11/2016', '12:00' )
    ,( 1,'20/11/2016', '13:00' )
    ,( 1,'20/11/2016', '18:30' )
    ,( 4,'20/11/2016', '08:30' )
    ,( 4,'20/11/2016', '12:01' )
    ,( 4,'20/11/2016', '13:10' )
    ,( 4,'20/11/2016', '18:00' );
     


     WITH   Dados
              AS ( SELECT   T.id ,
                            T.dataAcesso ,
                            T.horario,
    PrimeiroAcesso = FIRST_VALUE(t.horario) OVER(PARTITION BY T.id ORDER BY T.id),
    UltimoAcesso = LAST_VALUE(t.horario) OVER(PARTITION BY T.id ORDER BY T.id)
                   FROM     @table AS T
                 )
        SELECT  Dados.id ,
                Dados.dataAcesso ,
                Dados.horario,
    Dados.PrimeiroAcesso,
    Dados.UltimoAcesso
        FROM    Dados
    WHERE Dados.horario = Dados.PrimeiroAcesso 
    ORDER BY Dados.id



    Wesley Neves


    • Editado Wesley Neves segunda-feira, 21 de novembro de 2016 12:38 correção
    • Marcado como Resposta Xarp2 segunda-feira, 21 de novembro de 2016 13:22
    segunda-feira, 21 de novembro de 2016 12:32
  • Olá José,

    Acredito que esteja na categoria errada, pois o que você tem é um arquivo texto e quer ler e tratar ele no C#, então aqui vai minha contribuição trabalhando inteiramente no C#

    Primeiramente é necessário identificar qual é o separador de colunas desse seu arquivo. No exemplo que fiz assumi que sejam espaços mesmo.

    Primeiramente criei uma classe para organizar os dados:

            public class BatidaPonto
            {
                public int Pessoa_Id { get; set; }
                public DateTime Data { get; set; }
    
                public BatidaPonto(int id, DateTime data)
                {
                    Pessoa_Id = id;
                    Data = data;
                }
            }

    Depois tem o código que lê, organiza e cria um novo arquivo como você deseja:

                // LENDO E PADRONIZANDO ARQUIVO
                string[] texto;
                string id = string.Empty, data = string.Empty;
                string[] arqOriginal = File.ReadAllLines(@"CAMINHO_ARQUIVO_ORIGEM");
                List<BatidaPonto> batidas = new List<BatidaPonto>();
                
                foreach (string linha in arqOriginal)
                {
                    //Verificação para saber que não é o cabeçalho
                    if (!linha.ToLower().Contains("pessoa") && linha.Trim().Length > 0)
                    {
                        texto = linha.Split(' ').Where(x => x.Replace(" ", "").Length > 0).ToArray();
                        id = texto[0].Trim();
                        data = texto[1].Trim() + " " + texto[2].Trim();
                        batidas.Add(new BatidaPonto(int.Parse(id), DateTime.Parse(data)));
                    }
                }
    
                //CRIANDO NOVO ARQUIVO
    
                //Cabeçalho
                File.AppendAllText(@"CAMINHO_ARQUIVO_DESTINO", "Pessoa_id|data|hora\r\n");
                BatidaPonto batida;
    
                foreach (var pessoa_id in batidas.GroupBy(u => u.Pessoa_Id).Select(g => g.Key).ToList())
                {
                    batida = batidas.OrderBy(x => x.Data).First(x => x.Pessoa_Id == pessoa_id);
                    File.AppendAllText(@"CAMINHO_ARQUIVO_DESTINO", string.Format("{0}|{1}|{2}\r\n", batida.Pessoa_Id, batida.Data.ToShortDateString(), batida.Data.ToString("HH:mm")));
                    batida = batidas.OrderByDescending(x => x.Data).First(x => x.Pessoa_Id == pessoa_id);
                    File.AppendAllText(@"CAMINHO_ARQUIVO_DESTINO", string.Format("{0}|{1}|{2}\r\n", batida.Pessoa_Id, batida.Data.ToShortDateString(), batida.Data.ToString("HH:mm")));
                }

    DETALHES: Substitua os caminhos dos arquivos, pois no exemplo apenas identifiquei que você deve digitar o caminho de destino e origem. Outro detalhe é que o arquivo de destino eu separei as colunas por "|" pois fica melhor de trabalhar. Caso queira mudar é só altera o código.

    Espero ter ajudado!

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco


    segunda-feira, 21 de novembro de 2016 12:33
  • REMEMBER IT!!!

    "Andre, we found a few accounts that keep voting for your content as helpful. It's starting to get flagged, and it eventually will lead to banning accounts.
    So we need your help to ask those people to stop voting your posts. (They're specifically voting up your responses; and the profiles only exist for that one purpose.)"
    segunda-feira, 21 de novembro de 2016 13:18
  • Deleted
    segunda-feira, 21 de novembro de 2016 16:41
  • Sabino,

    Acredito que o exemplo do José Diz seja exatamente a solução que você necessita, não se esqueça de aplicar uma forma de ordenação dos seus dados para que possam ser apresentados de forma mais próxima a sua necessidade, neste caso, o uso do comando Order By torna-se uma boa alternativa.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 24 de novembro de 2016 23:25