Fill in missed numbers.
authorsgf <sgf.dma@gmail.com>
Wed, 3 Aug 2022 15:44:49 +0000 (18:44 +0300)
committersgf <sgf.dma@gmail.com>
Wed, 3 Aug 2022 16:28:00 +0000 (19:28 +0300)
fix-columns/1.csv
fix-columns/fix-columns.go

index cd6dbdc..96fa810 100644 (file)
@@ -4,5 +4,5 @@
 ",,
 ,あか ・ あかい,,赤 ・ 赤い ," красный цвет, красный ",,
 , ,,明るい,  あかるい светлый,くらい ,
-,,秋 ,,あき осень,,
+3,,秋 ,,あき осень,,
 ,,が,開く ,"  あく あける  открываться, раскрываться ",,
index d70d4aa..d463e85 100644 (file)
@@ -8,6 +8,7 @@ import (
     "io"
     "unicode"
     "unicode/utf8"
+    "strconv"
 )
 
 const (
@@ -111,24 +112,53 @@ func fixHiraganaInTranslation (record []string) ([]string) {
     return record
 }
 
-func main() {
-    fnIn, err := os.Open("1.csv")
-    if err != nil {
-        fmt.Printf("Error: %v\n", err)
-        return
+// Find max used row number. Do not modify anything.
+func maxUsedNumber (n *int, record []string) []string {
+    x, err := strconv.Atoi(record[fieldNumber])
+    if err == nil && *n < x {
+        *n = x
     }
+    return record
+}
 
-    fnOut, err := os.OpenFile("2.csv", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0755)
+// Fill empty row numbers. 'maxUsedNumber' must be run first to find max unused
+// row number.
+func fixNumber (n *int, record []string) []string {
+    _, err := strconv.Atoi(record[fieldNumber])
     if err != nil {
-        fmt.Printf("Error: %v\n", err)
-        return
+        fmt.Printf("Resetting 'number' field value '%v' to number '%v' in row '%v'\n", record[fieldNumber], *n, record)
+        record[fieldNumber] = strconv.Itoa(*n)
+        *n += 1
     }
+    return record
+}
+
+func fixColumns (fnIn io.ReadSeeker, fnOut io.Writer) {
 
     csvIn  := csv.NewReader(fnIn)
     csvOut := csv.NewWriter(fnOut)
     defer csvOut.Flush()
 
-    for {
+    n := 0
+    for i := 0; ; i++ {
+        record, err := csvIn.Read()
+        if err != nil {
+            if err == io.EOF {
+                break
+            }
+            fmt.Printf("Error: %v\n", err)
+            return
+        }
+        if i == 0 {
+            continue
+        }
+        maxUsedNumber(&n, record)
+    }
+    fmt.Printf("Maximum row number '%v'\n", n)
+    n += 1
+
+    fnIn.Seek(0, io.SeekStart)
+    for i := 0; ; i++ {
         l, err := csvIn.Read()
         if err != nil {
             if err == io.EOF {
@@ -139,10 +169,12 @@ func main() {
         }
         fmt.Printf("row: %v\n", l)
         f := func (record []string) []string {
-            return trimRecordSpaces(fixHiraganaInTranslation(record))
+            return fixNumber(&n, trimRecordSpaces(fixHiraganaInTranslation(record)))
         }
-        //err = csvOut.Write(splitReading(l))
-        err = csvOut.Write(f(l))
+        if i > 0 {
+            l = f(l)
+        }
+        err = csvOut.Write(l)
         if err != nil {
             fmt.Printf("Error: %v\n", err)
             return
@@ -150,3 +182,21 @@ func main() {
     }
 }
 
+func main() {
+    fnIn, err := os.Open("1.csv")
+    if err != nil {
+        fmt.Printf("Error: %v\n", err)
+        return
+    }
+    defer fnIn.Close()
+
+    fnOut, err := os.OpenFile("2.csv", os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0755)
+    if err != nil {
+        fmt.Printf("Error: %v\n", err)
+        return
+    }
+    defer fnOut.Close()
+
+    fixColumns(fnIn, fnOut)
+}
+