@@ -175,7 +175,7 @@ type fileFormat struct {
175
175
}
176
176
177
177
const keyPattern = "[[:alnum:]:_.]+"
178
- const valuePattern = "[\\ d-]+ "
178
+ const valuePattern = "(?:max| [\\ d-\\ .]+) "
179
179
180
180
var fileFormats = [... ]fileFormat {
181
181
// VAL\n
@@ -205,9 +205,9 @@ var fileFormats = [...]fileFormat{
205
205
// VAL0 VAL1 ...\n
206
206
{
207
207
name : "Space separated values" ,
208
- pattern : "^(" + valuePattern + " )+\n $" ,
208
+ pattern : "^(" + valuePattern + " ? )+\n $" ,
209
209
parser : func (measurement string , fields map [string ]interface {}, b []byte ) {
210
- re := regexp .MustCompile ("(" + valuePattern + ") " )
210
+ re := regexp .MustCompile ("(" + valuePattern + ")" )
211
211
matches := re .FindAllStringSubmatch (string (b ), - 1 )
212
212
for i , v := range matches {
213
213
fields [measurement + "." + strconv .Itoa (i )] = numberOrString (v [1 ])
@@ -229,13 +229,60 @@ var fileFormats = [...]fileFormat{
229
229
}
230
230
},
231
231
},
232
+ // NAME0 KEY0=VAL0 ...\n
233
+ // NAME1 KEY1=VAL1 ...\n
234
+ // ...
235
+ {
236
+ name : "Equal sign separated key-value pairs, multiple lines with name" ,
237
+ pattern : fmt .Sprintf ("^(%s( %s=%s)+\n )+$" , keyPattern , keyPattern , valuePattern ),
238
+ parser : func (measurement string , fields map [string ]interface {}, b []byte ) {
239
+ lines := strings .Split (string (b ), "\n " )
240
+ for _ , line := range lines {
241
+ f := strings .Fields (line )
242
+ if len (f ) == 0 {
243
+ continue
244
+ }
245
+ name := f [0 ]
246
+ for _ , field := range f [1 :] {
247
+ k , v , found := strings .Cut (field , "=" )
248
+ if found {
249
+ fields [strings .Join ([]string {measurement , name , k }, "." )] = numberOrString (v )
250
+ }
251
+
252
+ }
253
+
254
+ }
255
+ },
256
+ },
257
+ // KEY0=VAL0 KEY1=VAL1 ...\n
258
+ {
259
+ name : "Equal sign separated key-value pairs on a single line" ,
260
+ pattern : fmt .Sprintf ("^(%s=%s ?)+\n $" , keyPattern , valuePattern ),
261
+ parser : func (measurement string , fields map [string ]interface {}, b []byte ) {
262
+ f := strings .Fields (string (b ))
263
+ if len (f ) == 0 {
264
+ return
265
+ }
266
+ for _ , field := range f {
267
+ k , v , found := strings .Cut (field , "=" )
268
+ if found {
269
+ fields [strings .Join ([]string {measurement , k }, "." )] = numberOrString (v )
270
+ }
271
+
272
+ }
273
+ },
274
+ },
232
275
}
233
276
234
277
func numberOrString (s string ) interface {} {
235
278
i , err := strconv .ParseInt (s , 10 , 64 )
236
279
if err == nil {
237
280
return i
238
281
}
282
+ f , err := strconv .ParseFloat (s , 64 )
283
+ if err == nil {
284
+ return f
285
+ }
239
286
240
287
return s
241
288
}
0 commit comments