【问题标题】:Reading from a file and check for file endings从文件中读取并检查文件结尾
【发布时间】:2019-05-10 13:02:12
【问题描述】:

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

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

不幸的是,我被困在第 3 步,需要一些有关“换行”字符(即“/n”)的帮助。我曾尝试使用filesText, err := ioutil.ReadFile(fileNameAndDirectory),但不幸的是,如果我在将filesText 转换为字符串后尝试检查文件结尾,我将无法检测到换行符(即,如果文件文本为“/nhello/n”,则以下代码 sn -p 不会打印字符串“匹配”

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

)。

有没有什么办法可以在不手动逐行读取文件的情况下检测新行?

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

【问题讨论】:

  • 不确定你在问什么,但字符串包有各种名称中带有“索引”的函数,可以找到换行符之类的东西。如果数据是 []byte 形式,那么 bytes 包会做一些类似的事情
  • 我会尝试通过一个例子来澄清它。假设我有一个内容为“ara/n;>$g9s”的文件,我的应用程序将在文件内容中移动时执行由该输入字符定义的操作。 IE。如果“a”执行动作 1,“r”执行动作 2,“/n”执行动作 3,依此类推,则上面的输入将按顺序执行以下动作 1,2,1,3...。但是,如果您将字节数组转换为字符串,那么我无法识别“/n”字符,因为尽管字符串具有与以前相同的格式,但如果您将其打印出来或将其连接到文件中,它们似乎已被删除。

标签: go


【解决方案1】:

我们只能猜测。你没有明确定义你的问题。请澄清您的具体问题或添加其他详细信息以准确突出您的需求。提供样本输入和输出。


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”,我的应用程序将执行一个操作 由该输入字符定义,因为它在内容中移动 文件。 IE。如果“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 ';'

【讨论】:

  • 抱歉之前没有说清楚,希望我的更新能让它更清楚。是否可以在不通过整个字符串搜索换行符的情况下执行上述操作?
猜你喜欢
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多