Jump to content
altyouth

Expressões Regulares

Recommended Posts

Tenho um código que le um arquivo csv e tenho expressões regulares pra encontrar determinados trechos. Pois bem, o código capta a maioria, mas tem alguns que nao são capturados 

msm seguindo a mesma regra das outras. 

 

O codigo esta em Scala

 

formato do arquivo csv:

 

Relatório de Controle de Ponto (por período);;;;;;;;;;;;;;;;;;;;;;;;;;;
;Empregador:;;;;CASTAWARE SOLUTIONS INC.;;;;;;;;;;;;CNPJ:;;;;;;1234567890;;;;
;Endereço:;;;;CastaStreet, 1234 - Hawai;;;;;;;;;;;;Unidade:;;;;;;;;;;
;Período:;;;;;01/09/2019;;;a;;14/09/2019;;;;;;Emitido em:;;;;;;14/setembro/2019;;;;
;Matrícula:;;;;1;;;;;;;;;;;;Admissão:;;;;;;01/junho/2016;;;;
;Escala atual:;;;;08:00 Livres Almoço Flex Seg---- / Sáb-Dom Repouso;;;;;;;;;;;;Demissão:;;;;;;;;;;
;Cargo:;;;;;;;;;;;;Função:;;;;;;;;;;;;;;
;Empregado:;;;;Roberto Gomes Soares;;;;;;;;;;;;;;;;;;;;;;
Dia;;;"Jornada realizada
ENTR. SAIDA ENTR. SAIDA";;;;;;; Turno;;;Jornada Diurna/Not.;;"Extra
Diurno/Not.";;;;;;Devido;Abono;;Desab;;; Justificativa
01/09 - dom;;;;;;;;;;(R) ;;;;;;;;;;;;;;;;;
02/09 - seg;;;10:25 12:34 13:35 18:28;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;07:02;00:00;00:00;;;00:00;;;00:58;;;;;;
03/09 - ter;;;09:18 12:04 13:23 19:33;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;08:00;00:00;00:56;;;00:00;;;00:00;;;;;;
04/09 - qua;;;09:37 11:16 11:56 18:51;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;08:34;00:00;00:00;;;00:00;;;00:00;;;;;;
05/09 - qui;;;09:47 12:18 13:15 18:16;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;07:32;00:00;00:00;;;00:00;;;00:00;;;;;;
06/09 - ---;;;08:54 11:13 11:58 16:12;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;06:33;00:00;00:00;;;00:00;;;01:27;;;;;;
07/09 - sáb;;;;;;;;;;(R) ;;;;;;;;;;;;;;;;;
08/09 - dom;;;;;;;;;;(R) ;;;;;;;;;;;;;;;;;
09/09 - seg;;;09:22 11:40 12:44 19:07;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;08:00;00:00;00:41;;;00:00;;;00:00;;;;;;
10/09 - ter;;;;;;;;;;(F) 8:00h Livre (intervalo 12:00-13:00 [flex]);;;00:00;00:00;00:00;;;00:00;;;08:00;;;;;;
11/09 - qua;;;;;;;;;;(F) 8:00h Livre (intervalo 12:00-13:00 [flex]);;;00:00;00:00;00:00;;;00:00;;;08:00;;;;;;
12/09 - qui;;;;;;;;;;(F) 8:00h Livre (intervalo 12:00-13:00 [flex]);;;00:00;00:00;00:00;;;00:00;;;08:00;;;;;;
13/09 - ---;;;10:58 11:35 12:32 18:45;;;;;;;8:00h Livre (intervalo 12:00-13:00 [flex]);;;06:50;00:00;00:00;;;00:00;;;01:10;;;;;;
14/09 - sáb;;;;;;;;;;(R) ;;;;;;;;;;;;;;;;;
;Jornada + Abono;;;;;;;Jornada total;;;;52:31 (52,52);;;;00:00 (0,0);;;;;;;;;Jornada noturna;;
;52:31 (52,52);;;;;;;Extra total;;;;01:37 (1,62);;;;;;;;;;;;;;;
;Trabalhado (Jor.+Ext.);;;;;;;Atraso efetivo;;;;00:00 (0,0);;;;00:00 (0,0);;;;;;;;;Antecipação efetiva;;
;54:07 (54,13);;;;;;;Devido;;;;27:34 (27,58);;;;00:00 (0,0);;;;;;;;;Abonado;;
;Faltas;(horas);;;;;;Devido (s/faltas);;;;03:34 (3,58);;;;00:00 (0,0);;;;;;;;;Abonado (s/faltas);;
;3;24:00 (24,0);;;;;;Extra efetivo;;;;01:37 (1,62);;;;00:00 (0,0);;;;;;;;;Desabonado;;
;Dias;Feriados trab.;;;;;;Devido efetivo;;;;27:34 (27,58);;;;03:35:00;;;;;;;;;Devido efet(s/faltas;;
;14;0;;;;;;Dias escalados;;;;10;;;;-25:58 (-25,97);;;;;;;;;Saldo de Horas;;
;;;;;;;;BdH Acumulado;;;;-328:10 (-328,17);;;;80:00 (80,0);;;;;;;;;Horas programadas;;
Controle de Extra;;;;;;;;;;;;;;;;;;;;;;;;;;;
Jornada;;;;;;;Jornada de trabalho;;;;;;;;;;;;;;;;;;;52:30 (52,52);
Assinatura Gestor/Supervisor;;;;;;;;;;;;;;;;;;;Assinatura;;;;;;;;

 

No codigo eu pego as infos com nome do empregador, e os dias trabalhados alem do total de horas.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import scala.util.matching.Regex 
import scala.io.Source


import com.sun.xml.internal.ws.util.StringUtils

object teste {
  def main(args: Array[String]): Unit = {
    
    val patternEmp = "\\;Empregado:\\;{4}([A-Za-z]*) ([A-Za-z]*) ([A-Za-z]*)\\;*".r;
    val patternWkDay = "([0-9]{2}/[0-9]{2}) - ([a-z]{3})\\;{3}([0-9: ]*).*".r;
    val patternWkJourney = "\\;Jornada \\+ Abono\\;{7}Jornada total\\;{4}([0-9]{2}:[0-9]{2}).*".r
    val patternFlagTotJourney = "\\;(Trabalhado \\(Jor.+Ext.\\))\\;{7}Atraso efetivo\\;{4}[0-9: (,)]*\\;{4}[0-9: (,)]*\\;{9}Antecipação efetiva\\;\\;".r
    val patternTotJourney = "\\;([0-9: (,)]*)\\;{7}Devido\\;{4}[0-9: (,)]*\\;{4}[0-9: (,)]*.*".r
    
    val regexs = Seq[scala.util.matching.Regex](patternEmp,patternWkDay,patternWkJourney,patternFlagTotJourney,patternTotJourney)
    
    val fileName = "RelExtraPorPeriodo.csv";
    for(line <- Source.fromFile(fileName).getLines){
      traduzLinha(line, regexs);
    }
  }
  
  def traduzLinha(line : String, regexs:Seq[scala.util.matching.Regex]): Unit = {
     regexs.foreach{
       m => m.findAllIn(line).matchData foreach {
         n => 
           if(m.equals(regexs(0))){
             println("Empregado: " + n.group(1) + " " + n.group(2)+ " " + n.group(3)) 
           }
           if(m.equals(regexs(1))){
             println(n.group(1)+ "-" + n.group(2) + ": " + n.group(3))
           }
           if(m.equals(regexs(2))){
            println("Jornada total: "+ n.group(1) + "\n")
           }
           if(m.equals(regexs(3))){
             println(n.group(1)+ ":")
           }
           if(m.equals(regexs(4))){
             println(n.group(1)+"\n")
           }
       }
     }
}
}

Saida do codigo:

 

Empregado: Roberto Gomes Soares

01/09-dom: 

02/09-seg: 10:25 12:34 13:35 18:28

03/09-ter: 09:18 12:04 13:23 19:33

04/09-qua: 09:37 11:16 11:56 18:51

05/09-qui: 09:47 12:18 13:15 18:16

06/09----: 08:54 11:13 11:58 16:12

08/09-dom: 

09/09-seg: 09:22 11:40 12:44 19:07

10/09-ter: 

11/09-qua: 

12/09-qui: 

13/09----: 10:58 11:35 12:32 18:45

Jornada total: 52:31

 

Trabalhado (Jor.+Ext.):

54:07 (54,13)

 

01/09-dom: 

02/09-seg: 

03/09-ter: 09:11 14:53

04/09-qua: 11:48 17:54 18:25 20:03

05/09-qui: 10:54 16:34 16:57 18:36

06/09----: 19:12

08/09-dom: 

09/09-seg: 

10/09-ter: 09:25 17:42 17:53 19:02

11/09-qua: 11:25 11:55 12:54 18:28 18:57 19:26

12/09-qui: 13:06 15:19 15:42

13/09----: 09:26 11:36 12:33 19:47

Jornada total: 35:52

 

Trabalhado (Jor.+Ext.):

45:39 (45,65)

 

Empregado: Gabriel Nunes Santos

01/09-dom: 

02/09-seg: 10:00 19:04

03/09-ter: 10:18 19:23

04/09-qua: 18:56

05/09-qui: 10:03 12:03

06/09----: 09:44

08/09-dom: 

09/09-seg: 09:32 18:48

10/09-ter: 11:16

11/09-qua: 09:14

12/09-qui: 18:27

13/09----: 

Jornada total: 26:00

 

Trabalhado (Jor.+Ext.):

29:25 (29,42)

 

Empregado: Paulo Bandeira J

01/09-dom: 

02/09-seg: 

03/09-ter: 

04/09-qua: 

05/09-qui: 

06/09----: 

08/09-dom: 

09/09-seg: 

10/09-ter: 

11/09-qua: 

12/09-qui: 

13/09----: 

Jornada total: 00:00

 

Trabalhado (Jor.+Ext.):

00:00 (0,0)

 

01/09-dom: 

02/09-seg: 11:40 17:19 17:28 18:45

03/09-ter: 11:24 19:02

04/09-qua: 11:20 13:05 13:53 19:03

05/09-qui: 12:34 14:22 14:53 20:46

06/09----: 11:13 12:51 13:59 16:59 17:09 18:41

08/09-dom: 

09/09-seg: 11:16 18:48

10/09-ter: 

11/09-qua: 10:32 13:42 14:34 18:16

12/09-qui: 10:52 13:58 15:24 18:44

13/09----: 11:37 20:18

Jornada total: 64:10

 

Trabalhado (Jor.+Ext.):

64:51 (64,85)

 

Empregado: Carlos Alex de

01/09-dom: 

02/09-seg: 11:01 12:34 13:35 19:50

03/09-ter: 12:01 12:06 15:45 19:37

04/09-qua: 11:32 13:10 13:46

05/09-qui: 10:55 12:16 13:15 18:27

06/09----: 11:43 19:34

08/09-dom: 

09/09-seg: 10:43 11:45 12:44 19:07

10/09-ter: 13:06 14:09 20:36

11/09-qua: 12:57 18:28 18:57 21:04

12/09-qui: 10:02 13:58 15:24 18:27

13/09----: 09:49 11:38 12:32 19:12

Jornada total: 56:40

 

Trabalhado (Jor.+Ext.):

56:40 (56,67)

 

01/09-dom: 

02/09-seg: 10:14 18:13

03/09-ter: 13:13 17:05

04/09-qua: 11:16 16:01 16:13 18:09

05/09-qui: 13:32 17:29

06/09----: 10:44 12:27 12:42 16:58

08/09-dom: 

09/09-seg: 09:45 12:28 12:34 17:52

10/09-ter: 13:06 19:34

11/09-qua: 12:11 18:40

12/09-qui: 13:03 14:32 14:37 18:23

13/09----: 

Jornada total: 50:00

 

Trabalhado (Jor.+Ext.):

54:40 (54,68)

 

Empregado: Carol Maria Rondelli

01/09-dom: 

02/09-seg: 10:03 13:02 13:14 19:15

03/09-ter: 15:45 19:15

04/09-qua: 10:51 18:04

05/09-qui: 12:57 16:58 17:04 19:15

06/09----: 12:47 18:54

08/09-dom: 

09/09-seg: 10:54 19:31

10/09-ter: 16:08 19:01

11/09-qua: 09:58 13:39 14:51 19:20

12/09-qui: 12:40 19:16

13/09----: 11:53 18:15

Jornada total: 55:04

 

Trabalhado (Jor.+Ext.):

64:40 (64,67)

 

Empregado: Diego Rodrigues Abrantes

01/09-dom: 

02/09-seg: 11:15 17:26

03/09-ter: 08:55 16:59

04/09-qua: 12:39 17:18

05/09-qui: 10:59 17:20

06/09----: 14:11 19:43

08/09-dom: 

09/09-seg: 11:45 17:37

10/09-ter: 12:56 19:20

11/09-qua: 11:00 14:49

12/09-qui: 11:22 18:13

13/09----: 10:46 18:50

Jornada total: 00:00

 

Trabalhado (Jor.+Ext.):

61:46 (61,78)

 

Percebe-se que tem algumas horas sem nome do funcionario. Alguem sabe oq pode estar ocasionando essa anomalia

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Omar~
      Então, cá estou eu tentando fazer umas expressões regulares para validação de links para mídias sociais e me esbarrei em alguns problemas a averiguação da string:
      A ideia é ter uma expressão para cada mídia social presente no atual momento, só aceitando uma url válida para aquela mídia.
      Estou com um problema em passar condicionais que quando a string entrar num determinado formato ela deve seguir exatamente o modelo válido para aquela situação.
      Separei cada condicional em uma linha para melhor entendimento:
      <?php $urlA = "https://www.facebook.com/profile.php"; // ** ERA PARA SER INVÁLIDO $urlB = "https://www.facebook.com/profile.php?id="; // ERA PARA SER INVÁLIDO $urlC = "https://www.facebook.com/"; // ** ERA PARA SER INVÁLIDO $urlD = "https://www.facebook.com/Fulano"; // Válido, está OK $urlE = "https://www.facebook.com/profile.php?id=999999999999999"; // Válido, está OK $urlF = "https://www.facebook.com"; // ** ERA PARA SER INVÁLIDO $urlG = "https://www.faceboo"; // ** ERA PARA SER INVÁLIDO if (preg_match( '/^' . '(https[\:][\/][\/]www[\.]facebook[\.]com)' // Valida o endereço oficial da mídia . '?([\/])' // Caso contenha ou não uma "/" no final da url . '?([a-zA-Z À-ú 0-9]+)' // Valida se o link do perfil segue um modelo amigável (expl: /fulano) . '|(?:profile[\.]php[\?]id[\=]([0-9]{15}))' // Nessa condicional não estou acertando . '?(.*)' // Essa também não . '$/', $urlA)) { echo 'válido'; } else { echo 'inválido'; } Como podem notar são as duas últimas condicionais que estou com problemas, que são necessárias a correta averiguação das entradas na string, mas seu as adicionar assim como está no exemplo acima tudo desanda fazendo com que não der certo, uma vez removidas as urls que estão inválidas não são aceitas fazendo com que der certo, mas no entanto outras que são válidas passam a não ser aceitas.
      Onde estou errando? Ao meu ver escrevi a expressão corretamente, mas na prática está errada.
       
      Obs.: Por enquanto só escrevi essa para facebook farei para as demais depois que resolver esse empasse.
       
    • By lhgodoy
      Olá,
       
      Gostaria de saber como selecionar os trechos em VERDE do texto abaixo, utilizando REGEX. Os trechos em AMARELO são os que se repetem, mas existe um "pedaço" no meio dessa string que apresenta variações. Qual seria o melhor o melhor método para retirar apenas as frases em VERDE?
       
       
       
      Obrigado!

    • By fernandolukkas
      Essa é uma questão de um trabalho da facul, não estou conseguindo resolver. Alguém que possa me ajudar ?
       
      Laudilene, é professora de filosofia e amiga de Gilberto, professor de física. Ambos dão uma "colher de chá" para seus alunos. No caso de Laudilene, ela dá até meio ponto para que seus alunos atinjam a média 8 para serem aprovados.
      Depois de calcular as médias das provas dos alunos, Laudi, muito cansada, lançou todas as médias em um arquivo texto:
      10 - Bruce, 9.5 - Miranda, 7.9 - Bob, 10 - Zimbabue, 7.5 - Bety
      Qual é a expressão regular que pode ser utilizada para extrair o nome dos alunos que terão sua nota arredondada para 8.0 ?
    • By william010101
      Escreva uma regex que aceite um conjunto qualquer de 0, e 1 que tenha ao menos um 1.
    • By Julio Cavallari
      Preciso transformar uma string como essa: | A# | B/D# | C11 | D | E | F | G |;
      Nisso : | &A#& | &B&/&D#& | &C&11 | &D& | &E& | &F& | &G& |;
       
      O problema é que eu não entendo nada de expressão regular e não estou enxergando outra saída. Tentei usar str_replace(), porém não consigo fazer a função funcionar como quero. No exemplo que dei acima ela me retorna: | &A&# | &B&/&D&# | &C&11 | &D& | &E& | &F& | &G& |, porém preciso que os "#" estejam dentro dos "&".
       
      Vou explicar as regras que preciso seguir:
       
      Regra 1 - Somente de A - G e o simbolo "#";
      Regra 2 - Tratar uma letra no range A - G seguida de "#", ex: "A#", como um somente um match;
      Regra 3 - Adicionar o simbolo "&" antes e depois de cada match, EX: Recebeu | G | G# | G11 | G/B | deve transformar em | &G& | &G#& | &G&11 | &G&/&B& |
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.