Usuário com melhor resposta
FILTRAR ACESSOS

Pergunta
-
Tenho acessos coletados que estão em um arquivo de texto do seguinte modo
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 pessoaPessoa_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
Atenciosamente,
José Henrique Sabino
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
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
-
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- Editado André SeccoMVP segunda-feira, 21 de novembro de 2016 12:34
-
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.)" -
Deleted
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 24 de novembro de 2016 23:25
-
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]