从文件读取并检查文件结尾

时间:2018-12-09 11:39:27

标签: go

我正在尝试在Go中执行以下任务;

  1. 从文件读取
  2. 备份文件
  3. 基于逐字符输出的文件(例如,可能包括newLine字符或“ b”)覆盖并执行操作

不幸的是,我停留在第3步,希望对“换行”字符(即“ / n”)有所帮助。我尝试使用filesText, err := ioutil.ReadFile(fileNameAndDirectory),但是很不幸,如果在将filesText转换为字符串后尝试检查文件结尾,则无法检测到换行符(即,如果文件文本为“ / nhello / n”,以下代码段将不会显示字符串“ match”

filesText, err := ioutil.ReadFile(fileNameAndDirectory) 
if (string(filesText)[:2]) == "/n") {
    fmt.Println("match")
}

)。

是否可以执行某些操作来检测新行而无需手动逐行读取文件?

示例: 如果文件内容为“ r / n3 $ / n;”那么当我在文件内容上从左向右移动时,我应该能够执行6个预定义的操作(每个字符一个)。

1 个答案:

答案 0 :(得分:2)

我们只能猜测。您尚未明确定义问题。请阐明您的特定问题或添加其他详细信息以突出显示您的确切需求。提供示例输入和输出。


  

The Go Programming Language Specification

     

反斜杠后,某些单字符转义符表示特殊字符   值:

\n   U+000A line feed or newline

这是一个猜测:

lines.go

package main

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

func lines(data []byte) {
    text := string(data)
    for i, j := 0, 0; j >= 0; i += j + 1 {
        var line string
        j = strings.IndexByte(text[i:], '\n')
        if j < 0 {
            line = text[i:]
            if len(line) == 0 {
                continue
            }
        } else {
            line = text[i : i+j+1]
        }
        // process line
        fmt.Printf("%d %q\n", len(line), line)
    }
}

func main() {
    filename := `test.file`
    data, err := ioutil.ReadFile(filename)
    if err != nil {
        fmt.Fprintln(os.Stderr, err)
        return
    }
    fmt.Printf("%d %q\n", len(data), data)
    lines(data)
}

输出:

$ cat test.file
line1
line2
line3
$ go run lines.go
18 "line1\nline2\nline3\n"
6 "line1\n"
6 "line2\n"
6 "line3\n"

  

评论:

     

我将尝试通过示例进行澄清。假设我有一个档案   内容为“ ara / n;> $ g9s”,我的应用程序将执行一个操作   由该输入字符在其内容中移动时定义   文件。即如果“ a”执行动作1,“ r”执行动作2,“ / n”执行   动作3,依此类推,那么上面的输入将执行以下操作   按此顺序执行操作1,2,1,3...。但是,如果打开字节数组   到一个字符串,则我无法识别“ / n”字符,因为它们   尽管字符串的格式与   如果要打印出来或将其合并为文件,请先进行。 –艾略特·史密斯

为什么您要为换行符写/n!正如我已经指出的,换行符U + 000A写为\n

例如,

package main

import "fmt"

func es(s string) {
    for _, r := range s {
        switch r {
        case 'a':
            fmt.Printf("action 1 for %q\n", r)
        case 'r':
            fmt.Printf("action 2 for %q\n", r)
        case '\n':
            fmt.Printf("action 3 for %q\n", r)
        default:
            fmt.Printf("action ? for %q\n", r)
        }
    }
}

func main() {
    b := []byte("ara\n;>$g9s")
    s := string(b)
    es(s)
}

游乐场:https://play.golang.org/p/3J0pxXh3Wkc

输出:

action 1 for 'a'
action 2 for 'r'
action 1 for 'a'
action 3 for '\n'
action ? for ';'
action ? for '>'
action ? for '$'
action ? for 'g'
action ? for '9'
action ? for 's'

  

修订问题:

     

示例:如果文件内容为“ r / n3 $ / n;”那我应该能够   我移动时执行6个预定义的动作(每个角色一个)   从左到右显示文件内容。艾略特·史密斯


为什么您要为换行符写/n!正如我已经指出的,换行符U + 000A写为\n

例如,

package main

import "fmt"

func es(s string) {
    for _, r := range s {
        switch r {
        case 'a':
            fmt.Printf("action for %q\n", r)
        case 'r':
            fmt.Printf("action for %q\n", r)
        case '\n':
            fmt.Printf("action for %q\n", r)
        default:
            fmt.Printf("action for %q\n", r)
        }
    }
}

func main() {
    file := []byte("r\n3$\n;")
    s := string(file)
    es(s)
}

游乐场:https://play.golang.org/p/X1gtrPRmlqq

输出:

action for 'r'
action for '\n'
action for '3'
action for '$'
action for '\n'
action for ';'