【Go學習】 逐行讀寫文件

簡單的翻看了一下Go的io/ioutil居然沒又逐行讀取的接口,在網上找到一份代碼,發現其還比較使用,打算擼個例子試試看,網上的逐行讀取的接口如下:

func ReadLine(fileName string, handler func(string)) error {  
    f, err := os.Open(fileName)  
    if err != nil {  
        return err  
    }  
    buf := bufio.NewReader(f)  
    for {  
        line, err := buf.ReadString('\n')  
        line = strings.TrimSpace(line)  
        handler(line)  
        if err != nil {  
            if err == io.EOF {  
                return nil  
            }  
            return err  
        }  
    }  
    return nil  
}  

自己做了一個簡單的讀取文件,寫文件的例子:

 package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
)

func ReadLine(w *bufio.Writer,fileName string, handler func(*bufio.Writer,string)) error {
    f, err := os.Open(fileName)
    if err != nil {
        return err
    }
    buf := bufio.NewReader(f)
    for {
        line, err := buf.ReadString('\n')
        line = strings.TrimSpace(line)
        if len(line) != 0 {
            handler(w,line)
        } 
        if err != nil {
            if err == io.EOF {
                return nil
            }
            return err
        }
    }
    return nil
}

func parseLineString(w *bufio.Writer,line string) {
    splits := strings.SplitN(line," ",3)
    //fmt.Println("len(splits) = ",len(splits))
    if len(splits) != 3 {
        fmt.Println("Error file Format!")
        return
    }
    /*
    for index,split := range splits {
        fmt.Printf("index = %d split = %s \n",index,split)
    }
    fmt.Println("______________________________")
    */
    saveResultToFile(w,splits)
}

func saveResultToFile(w *bufio.Writer,splits []string) {
    str := "<tr>" + 
    "<td><font color=\"" + splits[1] + "\">" + splits[0] + "</font></td>" + 
    "<td><font color=\"" + splits[1] + "\">" + splits[1] + "</font></td>" + 
    "<td bgcolor=" + splits[1]  + ">" + splits[2] + "</td>" + 
 "</tr>" + "\n";

    //fmt.Println(str) 
    _,err := w.WriteString(str)
    check(err)
    w.Flush()
}

func check(e error){
    if e != nil {
        panic(e)
    }
}


func main() {
    f, err := os.Create("result.txt")
    check(err)
    defer f.Close()
    w := bufio.NewWriter(f)
    err = ReadLine(w,"test.txt", parseLineString)
    check(err)
}

test.txt文件如下:

AliceBlue #F0F8FF rgb(240, 248, 255)
AntiqueWhite #FAEBD7 rgb(250, 235, 215)
Aqua #00FFFF rgb(0, 255, 255)
Aquamarine #7FFFD4 rgb(127, 255, 212)
Azure #F0FFFF rgb(240, 255, 255)

運行後結果文件的內容如下:

<tr><td><font color="#F0F8FF">AliceBlue</font></td><td><font color="#F0F8FF">#F0F8FF</font></td><td bgcolor=#F0F8FF>rgb(240, 248, 255)</td></tr>
<tr><td><font color="#FAEBD7">AntiqueWhite</font></td><td><font color="#FAEBD7">#FAEBD7</font></td><td bgcolor=#FAEBD7>rgb(250, 235, 215)</td></tr>
<tr><td><font color="#00FFFF">Aqua</font></td><td><font color="#00FFFF">#00FFFF</font></td><td bgcolor=#00FFFF>rgb(0, 255, 255)</td></tr>
<tr><td><font color="#7FFFD4">Aquamarine</font></td><td><font color="#7FFFD4">#7FFFD4</font></td><td bgcolor=#7FFFD4>rgb(127, 255, 212)</td></tr>
<tr><td><font color="#F0FFFF">Azure</font></td><td><font color="#F0FFFF">#F0FFFF</font></td><td bgcolor=#F0FFFF>rgb(240, 255, 255)</td></tr>

其實這個是用來我上一篇文章轉載別人博客—-CSDN-markdown編輯器語法——字體、字號與顏色,背景色的時候用到,因爲copy過去的顏色名列表不能直接用,所以剛好用Go寫一個簡單的小例子試試。

發佈了114 篇原創文章 · 獲贊 52 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章