言恒-golang面试题

150 阅读1分钟

image.png

package main

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

func main() {
   translate("output.txt")
   parse("input.txt")
}

/**
解码
*/
func parse(name string) {
   file, err := os.Open(name)

   if err != nil {
      log.Fatalf("Error when opening file: %s", err)
   }
   defer file.Close()
   fileScanner := bufio.NewScanner(file)

   for fileScanner.Scan() {
      //根据逗号切割
      arr := strings.Split(fileScanner.Text(), ",")
      tmp_arr := []string{}
      all_n := 0
      for _, v := range arr {
         cur_n := strings.Count(v, string('"'))
         all_n += cur_n //到目前出现的引号总个数
         //奇数+奇数 = 偶数
         if len(tmp_arr) > 0 && ((cur_n%2 == 1 && all_n%2 == 0) || cur_n == 0 && all_n%2 == 1) {
            tmp_arr[len(tmp_arr)-1] = tmp_arr[len(tmp_arr)-1] + "," + v
         } else {
            tmp_arr = append(tmp_arr, v)
         }
      }
      newLine := []string{}
      for _, v := range tmp_arr {
         if len(v) >= 2 && v[0] == '"' && v[len(v)-1] == '"' {
            v = v[1 : len(v)-1]
            v = strings.Replace(v, `""`, `"`, -1)
         }
         newLine = append(newLine, v)
      }
      result := strings.Join(newLine, "\t")
      fmt.Println(result)
   }

}

/**
编码
*/
func translate(name string) {
   file, err := os.Open(name)
   if err != nil {
      log.Fatalf("Error when opening file: %s", err)
   }
   defer file.Close()
   fileScanner := bufio.NewScanner(file)
   for fileScanner.Scan() {
      //根据逗号切割
      arr := strings.Split(fileScanner.Text(), "       ")
      ret := []string{}
      for _, v := range arr {
         v = strings.Replace(v, `"`, `""`, -1)

         if strings.Contains(v, ",") || strings.Contains(v, `"`) {
            v = `"` + v + `"`
         }
         ret = append(ret, v)
      }
      result := strings.Join(ret, ",")

      fmt.Println(result)

      //写入文件

      //input, err := os.OpenFile("input.txt", os.O_WRONLY|os.O_APPEND, 0666)
      //if err != nil {
      // log.Fatalf("文件打开失败: %s", err)
      //}
      //defer input.Close()
      //
      //write := bufio.NewWriter(input)
      //write.WriteString(result + "\n")
      //write.Flush()
   }

}

output.txt

2       John       45       足球,摄影       New York
3       Carter Job       33       "健身",远足       河北,石家庄
4       Steve       33       大屏幕164"       DC"Home"
5       Jul,y       33       Football       Canada

input.txt

2,John,45,"足球,test,摄影",New York
3,Carter Job,33,"""健身"",远足","河北,石家庄"
4,Steve,33,"大屏幕164""","DC""Home"""
5,"Jul,y",33,Football,Canadaou