假如原始数据在txt中,格式如下:

    1.23  486    89.001

456.2   8.25     96.01

       456.01  456.6    456.1

每一行的空格数量不同,但是数字数量相同,列数保持一致。希望将这些数据保持所在行数和列数不变,保存在excel中。

保存在excel中,格式如下:

col1          col2            col3

row1 1.23 486 89.001    

row2       456.2      8.25         96.01

row3     456.01     456.6      465.1


golang代码如下:

package main


import (
"encoding/csv"
"fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"strings"
)


func main() {
dir := getCurrentFilePath()
readDir(dir)
fmt.Println("complete!  press any key to close this window!")
var in string
fmt.Scanf("%s", &in)
}


func readDir(dir string) {
rd, err := ioutil.ReadDir(dir)
if err != nil {
fmt.Println("read dir error!")
return
}
for _, file := range rd {
filename := file.Name()
fmt.Println("filename: ", filename)
if strings.Contains(filename, ".txt") {
str := readfile(filename)
if str == "" {
fmt.Println("readfile error!!!!!!!")
return
}


xlsname := strings.Trim(filename, ".txt") + ".xls"
f, err := os.Create(xlsname)
if err != nil {
fmt.Println("create " + xlsname + "failed!!!!!")
}
defer f.Close()
f.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM
w := csv.NewWriter(f)


sli := getRowsSli(str) //sli:[  12  45 8,   456 8  9,...]
for _, v := range sli {
val := formatString(v) //val: [12 45 8]
w.Write(val)
}
w.Flush()
}
}
}


func getCurrentFilePath() string {
file, _ := exec.LookPath(os.Args[0])
path, _ := filepath.Abs(file)
dir, _ := filepath.Split(path)
return dir
}



func readfile(filename string) string {
file, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Println("there is no source.txt")
return ""
}
f := string(file)
return f
}

//txt中换行是“\n”
func getRowsSli(str string) []string {
sli := strings.Split(str, "\n")
return sli
}


// 32->空格    9->tab
func formatString(str string) []string {
srcLength := len(str)
rtnSli := []string{}
i := 0
for {
if str[i] >= 48 && str[i] <= 57 {
// 开始循环取数据
var tmp string
for {
tmp = tmp + string(str[i])
i++
if i >= srcLength {
break
}
if str[i] == 32 || str[i] == 9 {
break
}
}
rtnSli = append(rtnSli, tmp)
}
if i >= srcLength {
break
}
i++
}
return rtnSli
}