go - 从文件中读取并检查文件结尾
问题描述
我正在尝试在 Go 中执行以下任务;
- 从文件中读取
- 备份文件
- 根据逐个字符输出的文件覆盖并执行操作(例如,可能包括换行符或“b”)
不幸的是,我被困在第 3 步,想要一些有关“换行”字符(即“/n”)的帮助。我尝试过使用filesText, err := ioutil.ReadFile(fileNameAndDirectory)
,但不幸的是,如果我在转换为字符串后尝试检查文件结尾,filesText
我将无法检测到换行符(即,如果文件文本是“/nhello/n”,那么以下代码片段将不会打印字符串“匹配”
filesText, err := ioutil.ReadFile(fileNameAndDirectory)
if (string(filesText)[:2]) == "/n") {
fmt.Println("match")
}
)。
在不手动逐行读取文件的情况下,我可以做些什么来检测新行?
示例:如果文件内容是“r/n3$/n;” 那么当我在文件内容上从左向右移动时,我应该能够执行 6 个预定义的操作(每个字符一个)。
解决方案
我们只能猜测。你没有明确定义你的问题。请澄清您的具体问题或添加其他详细信息以准确突出您的需求。提供样本输入和输出。
在反斜杠之后,某些单字符转义表示特殊值:
\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 ';'
推荐阅读
- linux - 使文件自动对其他用户可读的问题?
- sql - 基于foreign_key的百分比
- android - 如何使用改造处理对象列表或单个对象的 JSON 响应?
- java - java.time.format.DateTimeParseException:无法在索引 0 处解析文本“Tue Jan 08 00:00:00 IST 2019”
- r - 如何在ggplot2(R)的条形图中仅更改一个条形的geom_text的颜色和位置?
- javascript - Typescript 触发事件中的测验无法正常工作
- emacs - 如何配置带有 lambda 的钩子?(保存参数以在 lambdas 中使用)
- sql - 如何查询 SYS 模式表中的列?
- javascript - Angular 7“期望'样式'是一个字符串数组”
- node.js - 导出模块中的访问函数