@@ -1516,6 +1516,7 @@ func builtinParseYAML(i *interpreter, str value) (value, error) {
1516
1516
func builtinParseCSVWithHeader (i * interpreter , arguments []value ) (value , error ) {
1517
1517
strv := arguments [0 ]
1518
1518
dv := arguments [1 ]
1519
+ odhv := arguments [2 ]
1519
1520
1520
1521
sval , err := i .getString (strv )
1521
1522
if err != nil {
@@ -1536,6 +1537,15 @@ func builtinParseCSVWithHeader(i *interpreter, arguments []value) (value, error)
1536
1537
d = rune (ds [0 ]) // conversion to rune
1537
1538
}
1538
1539
1540
+ odh := true // default value for overwrite_duplicate_headers
1541
+ if odhv .getType () != nullType {
1542
+ odhval , err := i .getBoolean (odhv )
1543
+ if err != nil {
1544
+ return nil , err
1545
+ }
1546
+ odh = odhval .value
1547
+ }
1548
+
1539
1549
json := make ([]interface {}, 0 )
1540
1550
var keys []string
1541
1551
@@ -1552,14 +1562,19 @@ func builtinParseCSVWithHeader(i *interpreter, arguments []value) (value, error)
1552
1562
}
1553
1563
1554
1564
if row == 0 { // consider first row as header
1555
- // detect and handle duplicate headers
1556
- keyCount := map [string ]int {}
1557
- for _ , k := range record {
1558
- keyCount [k ]++
1559
- if c := keyCount [k ]; c > 1 {
1560
- keys = append (keys , fmt .Sprintf ("%s__%d" , k , c - 1 ))
1561
- } else {
1562
- keys = append (keys , k )
1565
+ if odh {
1566
+ // Overwrite duplicate headers
1567
+ keys = record
1568
+ } else {
1569
+ // detect and handle duplicate headers
1570
+ keyCount := map [string ]int {}
1571
+ for _ , k := range record {
1572
+ keyCount [k ]++
1573
+ if c := keyCount [k ]; c > 1 {
1574
+ keys = append (keys , fmt .Sprintf ("%s__%d" , k , c - 1 ))
1575
+ } else {
1576
+ keys = append (keys , k )
1577
+ }
1563
1578
}
1564
1579
}
1565
1580
} else {
@@ -2262,12 +2277,12 @@ func builtinAvg(i *interpreter, arrv value) (value, error) {
2262
2277
if err != nil {
2263
2278
return nil , err
2264
2279
}
2265
-
2280
+
2266
2281
len := float64 (arr .length ())
2267
2282
if len == 0 {
2268
2283
return nil , i .Error ("Cannot calculate average of an empty array." )
2269
2284
}
2270
-
2285
+
2271
2286
sumValue , err := builtinSum (i , arrv )
2272
2287
if err != nil {
2273
2288
return nil , err
@@ -2277,7 +2292,7 @@ func builtinAvg(i *interpreter, arrv value) (value, error) {
2277
2292
return nil , err
2278
2293
}
2279
2294
2280
- avg := sum .value / len
2295
+ avg := sum .value / len
2281
2296
return makeValueNumber (avg ), nil
2282
2297
}
2283
2298
@@ -2685,7 +2700,7 @@ var funcBuiltins = buildBuiltinMap([]builtin{
2685
2700
& unaryBuiltin {name : "parseInt" , function : builtinParseInt , params : ast.Identifiers {"str" }},
2686
2701
& unaryBuiltin {name : "parseJson" , function : builtinParseJSON , params : ast.Identifiers {"str" }},
2687
2702
& unaryBuiltin {name : "parseYaml" , function : builtinParseYAML , params : ast.Identifiers {"str" }},
2688
- & generalBuiltin {name : "parseCsvWithHeader" , function : builtinParseCSVWithHeader , params : []generalBuiltinParameter {{name : "str" }, {name : "delimiter" , defaultValue : & nullValue }}},
2703
+ & generalBuiltin {name : "parseCsvWithHeader" , function : builtinParseCSVWithHeader , params : []generalBuiltinParameter {{name : "str" }, {name : "delimiter" , defaultValue : & nullValue }, { name : "overwrite_duplicate_headers" , defaultValue : & nullValue } }},
2689
2704
& generalBuiltin {name : "manifestCsv" , function : builtinManifestCsv , params : []generalBuiltinParameter {{name : "json" }, {name : "headers" , defaultValue : & nullValue }}},
2690
2705
& generalBuiltin {name : "manifestJsonEx" , function : builtinManifestJSONEx , params : []generalBuiltinParameter {{name : "value" }, {name : "indent" },
2691
2706
{name : "newline" , defaultValue : & valueFlatString {value : []rune ("\n " )}},
0 commit comments