La chaîne est donnée sous la forme
def parser(filename: String):String = {
val extractDate = """(\d{8}).*""".r
val extractDate(dd) = filename;
dd;
}
La fonction Parser pour extraire "20200707" comme ci-dessous.
var filedate = parser("test_pb_PP_Quality_2-Report_20200707.csv");
Mais son erreur renvoie comme Exception dans le thread "main" scala.MatchError:
3 Réponses :
Vous pouvez essayer d'utiliser la String # replaceAll de Java ici:
20200707
Ceci imprime:
def parser(filename: String):String = {
val extractDate = filename.replaceAll(".*(\\d{8}).*", "$1");
extractDate;
}
println(parser("test_pb_PP_Quality_2-Report_20200707.csv"))
pourrions-nous utiliser regex pour le même?
Eh bien ... cette réponse est à l'aide de regex, si vous regardez de près :-)
Autorisez simplement du texte avant les nombres en ajoutant . * au début de l'expression régulière:
def parser(filename: String):String = {
val extractDate = """.*(\d{8}).*""".r
filename match {
case extractDate(dd) => dd
case _ => throw new RuntimeException(s"Invalid filename $filename")
}
}
Vous pouvez également utiliser une expression de correspondance pour gérer le cas où le nom de fichier n'a pas le format attendu:
def parser(filename: String):String = {
val extractDate = """.*(\d{8}).*""".r
val extractDate(dd) = filename;
dd;
}
Par défaut, une expression régulière créée avec la méthode .r est ancrée, ce qui signifie qu'elle doit correspondre à la chaîne entière. (pensez à votre expression régulière comme étant incluse dans ^ et $ )
Vous pouvez utiliser une expression régulière non ancrée à la place:
def parser(filename: String): Option[String] = {
"""\d{8}""".r.findFirstIn(filename)
}
parser("test_pb_PP_Quality_2-Report_20200707.csv") match {
case Some(datetime) => // do something
case None => // handle this case
}
Cela fonctionne, mais c'est une mauvaise pratique car "l'analyse" lèverait une exception si votre entrée ne correspond pas. Plus idiomatique serait de renvoyer une Option [String] et de la gérer sur le site appelant. Par exemple:
def parser(filename: String):String = {
val extractDate = """(\d{8})""".r.unanchored
val extractDate(dd) = filename
dd
}