如何读取其中包含不同表格的txt文件
How to read a txt file that contains different tables in it
我必须在 R 中收集数据,这些数据以 xls 格式提供给我,但是当我用 Excel 打开它时它说扩展名和格式不匹配,文件建议我将其保存为 .txt 文件。
我必须使用的文件通常包含 3 个部分,其中包含不同的 table,它们具有不同的大小和列名。这些部分由方括号中的标题宣布。这是我的文件的 simplified version。
我只对名为“[DATA]”的第三部分感兴趣。到目前为止,我已经手动将其保存为 xlsx 文件,并按照我的方式使用我感兴趣的数据 read_excel。在 R 中读取整个 sheet 后,我收集了标题“[DATA]”所在的行(它可能因文件而异,我不能像 readLines 中那样 select 行号),然后在将列名(T、时间、张力等)作为我的新数据框的列名后,我可以 select 下面的 table 。我希望能够从一个 txt 文件开始做一些类似的事情,因为我有很多文件要处理,而且它们的格式完全相同。
我尝试了几个函数来将文件读取为 .txt,比如
1A = data.table::fread(file, header = F, fill=F, sep = '\t')
2) A = read.delim(file)
3)A = data.frame(readLines(file))
4) A = read.table(file)
它从 SETUP 中保存第一个 table 并提前停止,并显示此错误消息“在第 25 行提前停止。预期有 24 个字段但找到了 1 个。考虑 fill=TRUE 和 comment.char=。首先丢弃 non-empty 行:<>"。如果我键入 fill = TRUE,我会得到与 3.
相同的结果
它使所有单元格成为一个大列,一行接一行,逐个单元格。从那里重新排列 table 中的数据变得困难。
它又做了一个大列,但文件的每一行都是数据框中的一个单元格,单元格的内容是所有数字的字符串,由 \t 分隔。第 8 行的示例:experiment1\group1\t0\t7200\t0.001\t"
我收到此错误消息:扫描错误(file = file,what = what,sep = sep,quote = quote,dec = dec,:
第 4 行没有 2 个元素
我不知道这些功能中的哪一个最适合这项任务。
注意:错误消息中显示的数字可能与我在示例中得到的数字不同,但我什至没有在示例中收到错误消息(当我成功时,Excel要求我在单元格中加上撇号,这样 'minus' 符号就不会被视为公式,所以我做到了。然后我将文件保存为 txt 和 xls,甚至将 xls 扩展名添加到 txt 文件像在我的原始文件中那样创建一个不连贯的扩展名。它在任何情况下都有效。)
感谢您的帮助!
你说的是文本文件并显示电子表格,所以我将在多 table CSV 文件上进行演示:
csvtext <- '[SETUP]
ExpName:
GroupName:
,,
Experiment,Group,Voltage
1,1,1
2,2,2
3,3,3
,,
[RESULT]
Group,Dev,V3
1,1,1
3,3,3
4,4,4
,,
[Data]
"mpg","cyl","disp"
21,6,160
21,6,160
22.8,4,108
'
以文本形式读入:
# you may use something like
# rawtext <- readLines("path/to/file.csv")
rawtext <- readLines(textConnection(csvtext))
str(rawtext)
# chr [1:21] "[SETUP]" "ExpName:" "GroupName:" ",," "Experiment,Group,Voltage" "1,1,1" "2,2,2" "3,3,3" ",," "[RESULT]" ...
我们现在可以根据“空”行拆分数据,然后删除这些空行:
spltext <- split(rawtext, cumsum(!grepl("[^,\s]", rawtext)))
spltext <- lapply(spltext, function(z) if (grepl("[^,\s]", z[1])) z else z[-1])
str(spltext)
# List of 5
# $ 0: chr [1:3] "[SETUP]" "ExpName:" "GroupName:"
# $ 1: chr [1:4] "Experiment,Group,Voltage" "1,1,1" "2,2,2" "3,3,3"
# $ 2: chr [1:5] "[RESULT]" "Group,Dev,V3" "1,1,1" "3,3,3" ...
# $ 3: chr [1:5] "[Data]" "\"mpg\",\"cyl\",\"disp\"" "21,6,160" "21,6,160" ...
# $ 4: chr(0)
(注意 $ 0
表示 name 是 "0"
而不是 0
,所以我们需要使用字符串-稍后索引的数字。)
从这里开始,既然您只想要 [Data]
部分,那么
read.csv(text = spltext[["3"]][-1])
# mpg cyl disp
# 1 21.0 6 160
# 2 21.0 6 160
# 3 22.8 4 108
我这样做使它适用于我的任何文件 (txt) :
原始文本 <- readLines(文件)
#用空行分隔各个部分
spltext <- split(rawtext, cumsum(!grepl("[^,\t]", rawtext)))
#删除由先前空行编码的单元格 \t
spltext <- lapply(spltext, function(z) if (grepl("[^,\t]", z[1])) z else z[-1])
#索引为3的列是包含DATA的列table
data=read.delim(text = base[["3"]][-1], header= T, check.names=F) #check.names= F 没有影响标题
我必须在 R 中收集数据,这些数据以 xls 格式提供给我,但是当我用 Excel 打开它时它说扩展名和格式不匹配,文件建议我将其保存为 .txt 文件。
我必须使用的文件通常包含 3 个部分,其中包含不同的 table,它们具有不同的大小和列名。这些部分由方括号中的标题宣布。这是我的文件的 simplified version。
我只对名为“[DATA]”的第三部分感兴趣。到目前为止,我已经手动将其保存为 xlsx 文件,并按照我的方式使用我感兴趣的数据 read_excel。在 R 中读取整个 sheet 后,我收集了标题“[DATA]”所在的行(它可能因文件而异,我不能像 readLines 中那样 select 行号),然后在将列名(T、时间、张力等)作为我的新数据框的列名后,我可以 select 下面的 table 。我希望能够从一个 txt 文件开始做一些类似的事情,因为我有很多文件要处理,而且它们的格式完全相同。
我尝试了几个函数来将文件读取为 .txt,比如
1A = data.table::fread(file, header = F, fill=F, sep = '\t')
2) A = read.delim(file)
3)A = data.frame(readLines(file))
4) A = read.table(file)
它从 SETUP 中保存第一个 table 并提前停止,并显示此错误消息“在第 25 行提前停止。预期有 24 个字段但找到了 1 个。考虑 fill=TRUE 和 comment.char=。首先丢弃 non-empty 行:<
相同的结果>"。如果我键入 fill = TRUE,我会得到与 3. 它使所有单元格成为一个大列,一行接一行,逐个单元格。从那里重新排列 table 中的数据变得困难。
它又做了一个大列,但文件的每一行都是数据框中的一个单元格,单元格的内容是所有数字的字符串,由 \t 分隔。第 8 行的示例:experiment1\group1\t0\t7200\t0.001\t"
我收到此错误消息:扫描错误(file = file,what = what,sep = sep,quote = quote,dec = dec,: 第 4 行没有 2 个元素
我不知道这些功能中的哪一个最适合这项任务。
注意:错误消息中显示的数字可能与我在示例中得到的数字不同,但我什至没有在示例中收到错误消息(当我成功时,Excel要求我在单元格中加上撇号,这样 'minus' 符号就不会被视为公式,所以我做到了。然后我将文件保存为 txt 和 xls,甚至将 xls 扩展名添加到 txt 文件像在我的原始文件中那样创建一个不连贯的扩展名。它在任何情况下都有效。)
感谢您的帮助!
你说的是文本文件并显示电子表格,所以我将在多 table CSV 文件上进行演示:
csvtext <- '[SETUP]
ExpName:
GroupName:
,,
Experiment,Group,Voltage
1,1,1
2,2,2
3,3,3
,,
[RESULT]
Group,Dev,V3
1,1,1
3,3,3
4,4,4
,,
[Data]
"mpg","cyl","disp"
21,6,160
21,6,160
22.8,4,108
'
以文本形式读入:
# you may use something like
# rawtext <- readLines("path/to/file.csv")
rawtext <- readLines(textConnection(csvtext))
str(rawtext)
# chr [1:21] "[SETUP]" "ExpName:" "GroupName:" ",," "Experiment,Group,Voltage" "1,1,1" "2,2,2" "3,3,3" ",," "[RESULT]" ...
我们现在可以根据“空”行拆分数据,然后删除这些空行:
spltext <- split(rawtext, cumsum(!grepl("[^,\s]", rawtext)))
spltext <- lapply(spltext, function(z) if (grepl("[^,\s]", z[1])) z else z[-1])
str(spltext)
# List of 5
# $ 0: chr [1:3] "[SETUP]" "ExpName:" "GroupName:"
# $ 1: chr [1:4] "Experiment,Group,Voltage" "1,1,1" "2,2,2" "3,3,3"
# $ 2: chr [1:5] "[RESULT]" "Group,Dev,V3" "1,1,1" "3,3,3" ...
# $ 3: chr [1:5] "[Data]" "\"mpg\",\"cyl\",\"disp\"" "21,6,160" "21,6,160" ...
# $ 4: chr(0)
(注意 $ 0
表示 name 是 "0"
而不是 0
,所以我们需要使用字符串-稍后索引的数字。)
从这里开始,既然您只想要 [Data]
部分,那么
read.csv(text = spltext[["3"]][-1])
# mpg cyl disp
# 1 21.0 6 160
# 2 21.0 6 160
# 3 22.8 4 108
我这样做使它适用于我的任何文件 (txt) :
原始文本 <- readLines(文件)
#用空行分隔各个部分 spltext <- split(rawtext, cumsum(!grepl("[^,\t]", rawtext)))
#删除由先前空行编码的单元格 \t spltext <- lapply(spltext, function(z) if (grepl("[^,\t]", z[1])) z else z[-1])
#索引为3的列是包含DATA的列table data=read.delim(text = base[["3"]][-1], header= T, check.names=F) #check.names= F 没有影响标题