I have a byte array containing the output of an Active Directory call. I want to parse this and extract the amount of days until my account expires. Now I'm wondering: what's the best way to extract 22-4-2016 11:05:26
(so the value after Password Expires
)?
[]byte(`The request will be processed at a domain controller for domain local.nl.bol.com.
User name bla
Full Name bla bla
Comment
User's comment
Country code (null)
Account active Yes
Account expires Never
Password last set 13-3-2016 11:05:26
Password expires 22-4-2016 11:05:26
Password changeable 13-3-2016 11:05:26
Password required Yes
User may change password Yes
Workstations allowed All
Logon script bla.bat
User profile
Home directory
Last logon 31-3-2016 7:59:29
Logon hours allowed All
The command completed successfully.`)
Using strings.TrimSpace
, strings.Index
and referring to related stackoverflow answers, I got a working solution and please find working code below:-
package main
import (
"fmt"
"strings"
)
func CToGoString(c []byte) string {
n := -1
for i, b := range c {
if b == 0 {
break
}
n = i
}
return string(c[:n+1])
}
func main() {
s := []byte(`The request will be processed at a domain controller for domain local.nl.bol.com.
User name bla
Full Name bla bla
Comment
User's comment
Country code (null)
Account active Yes
Account expires Never
Password last set 13-3-2016 11:05:26
Password expires 22-4-2016 11:05:26
Password changeable 13-3-2016 11:05:26
Password required Yes
User may change password Yes
Workstations allowed All
Logon script bla.bat
User profile
Home directory
Last logon 31-3-2016 7:59:29
Logon hours allowed All
The command completed successfully.`)
d := CToGoString(s)
len := len("Password expires")
i := strings.Index(d, "Password expires")
j := strings.Index(d, "Password changeable")
chars := d[i+len:j]
fmt.Println(strings.TrimSpace(chars))
}
Have posted code to playground: http://play.golang.org/p/t0Xjd04-pi
You can do it by converting the []byte into a string and then using the strings package to find and extract the value and finally parsing it with time.Parse to convert the string to a time that you can work with.
package main
import (
"fmt"
"strings"
"time"
"log"
)
func main() {
line := data[strings.Index(data, "Password expires"):strings.Index(data, "Password changeable")]
date := strings.TrimSpace(strings.TrimPrefix(line, "Password expires"))
fmt.Println(date)
pDate, err := time.Parse("02-1-2006 03:04:05", date)
if err != nil {
log.Fatal(err)
}
fmt.Println(pDate)
}
var data = string([]byte(`The request will be processed at a domain controller for domain local.nl.bol.com.
User name bla
Full Name bla bla
Comment
User's comment
Country code (null)
Account active Yes
Account expires Never
Password last set 13-3-2016 11:05:26
Password expires 22-4-2016 11:05:26
Password changeable 13-3-2016 11:05:26
Password required Yes
User may change password Yes
Workstations allowed All
Logon script bla.bat
User profile
Home directory
Last logon 31-3-2016 7:59:29
Logon hours allowed All
The command completed successfully.`))
On the playground.