没有输出到错误文件

时间:2018-03-15 21:22:58

标签: go

我正在编写一个Go程序。 它逐行读取目录中的文件,它只读取具有特定前缀的行,规范化数据并输出到两个文件中的一个,具体取决于规范化记录是否具有一定数量的元素。

正在将数据输出到数据文件,但错误未输出到错误文件。

调试我没有看到任何问题。

非常感谢任何帮助。

谢谢,

马丁

package main

import (
    "bufio"
    "fmt"
    "io/ioutil"
    "log"
    "os"
    "strings"
)

func main() {

    //Output file - Data
    if _, err := os.Stat("allData.txt"); os.IsNotExist(err) {

        var file, err = os.Create("allData.txt")

        if err != nil {
            fmt.Println(err)
            return
        }
        defer file.Close()
    }

    file, err := os.OpenFile("allData.txt", os.O_WRONLY|os.O_APPEND, 0644)
    if err != nil {
        panic(err)
    }

    w := bufio.NewWriter(file)

    //Output file - Errors
    if _, err := os.Stat("errorData.txt"); os.IsNotExist(err) {

        var fileError, err = os.Create("errorData.txt")

        if err != nil {
            fmt.Println(err)
            return
        }
        defer fileError.Close()
    }

    fileError, err := os.OpenFile("errorData.txt", os.O_WRONLY|os.O_APPEND, 0644)
    if err != nil {
        panic(err)
    }

    z := bufio.NewWriter(fileError)

    //Read Directory
    files, err := ioutil.ReadDir("../")
    if err != nil {
        log.Fatal(err)
    }

    //Build file path
    for _, f := range files {
        fName := string(f.Name())
        sPath := string("../" + fName)
        sFile, err := os.Open(sPath)
        if err != nil {
            fmt.Println(err)            
            return
        }

        //Create scanner
        scanner := bufio.NewScanner(sFile)
        scanner.Split(bufio.ScanLines)
        var lines []string
        // This is the buffer now
        for scanner.Scan() {
            lines = append(lines, scanner.Text())
        }
        for _, line := range lines {

            sRecordC := strings.HasPrefix((line), "DATA:")

            if sRecordC {
                splitted := strings.Split(line, " ")
                splittedNoSpaces := deleteEmpty(splitted)

                if len(splittedNoSpaces) == 11 {
                    splittedString := strings.Join(splittedNoSpaces, " ")
                    sFinalRecord := string(splittedString + "\r\n")
                    if _, err = fmt.Fprintf(w, sFinalRecord); err != nil {
                    }
                }
                if len(splittedNoSpaces) < 11 {
                    splitted := strings.Split(line, " ")
                    splittedNoSpaces := deleteEmpty(splitted)
                    splittedString := strings.Join(splittedNoSpaces, " ")
                    sFinalRecord := string(splittedString + "\r\n")
                    if _, err = fmt.Fprintf(z, sFinalRecord); err != nil {
                    }

                    err = fileError.Sync()
                    if err != nil {
                        log.Fatal(err)
                    }
                }
            }
        }
    }
    err = file.Sync()
    if err != nil {
        log.Fatal(err)
    }
}

//Delete Empty array elements
func deleteEmpty(s []string) []string {
    var r []string
    for _, str := range s {
        if str != "" {
            r = append(r, str)
        }
    }
    return r
}

1 个答案:

答案 0 :(得分:3)

不要多次打开文件,在创建文件之前不要检查文件是否存在,只需使用os.O_CREATE标记即可。您还没有推迟正确的os.File.Close电话,因为它已多次打开。

使用bufio.Writer时,您应始终致电Flush()以确保所有数据都已写入基础io.Writer