2015-11-11 3 views
0

У меня есть файл журнала, который я пытаюсь проанализировать с помощью регулярного выражения.Петля через массив строк, чтобы соответствовать шаблону

создать массив строк из файла журнала, как это:

let loadLog = 
    File.ReadAllLines "c:/access.log" 
     |> Seq.filter (fun l -> not (l.StartsWith("#"))) 
     |> Seq.map (fun s -> s.Split()) 
     |> Seq.map (fun l -> l.[7],1) 
     |> Seq.toArray 

Я тогда нужно перебрать этот массив. Но я не думаю, что это сработает, потому что строка должна быть строкой.

Есть ли специальный способ справиться с чем-то подобным в f #?

type ActorDetails = 
    { 
     Date: DateTime 
     Name: string 
     Email: string 
    } 

for line in loadLog do 
    let line queryString = 
     match queryString with 
     | Regex @"[\?|&]system=([^&]+)" [json] -> 
      let jsonValue = JValue.Parse(Uri.UnescapeDataString(json)) 
      { 
        Date = DateTime.UtcNow (* replace with parsed date *) 
        Name = jsonValue.Value<JArray>("name").[0].Value<string>() 
        Email = jsonValue.Value<JArray>("mbox").[0].Value<string>().[7..] 
      } 
+1

Что вы хотите сделать внутри цикла? Как бы то ни было, ваша 'let line queryString' будет определять функцию, которую я подозреваю, это не то, что вы хотите сделать ... –

+0

@TomasPetricek Да, я добавил код, чтобы сделать его более понятным. Благодарю. – SkyeBoniwell

ответ

3

Использование частичного активного шаблона (| Regex | _ |), чтобы сделать это

open System.Text.RegularExpressions 

let (|Regex|_|) regexPattern input = 
    let regex = new Regex(regexPattern) 
    let regexMatch = regex.Match(input) 
    if regexMatch.Success 
    then Some regexMatch.Value 
    else None 

let queryString input = function 
    | Regex @"[\?|&]system=([^&]+)" s -> s 
    | _ -> sprintf "other: %s" input 
Смежные вопросы