跳到一个大的txt文件中的某个位置
skipping to a certain position in a large txt file
我想对 100 多个 .txt 文件进行计算。这些文件包含使用眼动仪收集的注视数据。
数据的第一部分是校准部分。它只包含有限数量的变量。每行看起来像这样(大约 20 000 行):
Event: Data - startTime 1563518990 endTime 1563619015 Gaze 885.638118989 316.57751978
数据的第二部分包含在凝视测试期间收集的实际凝视数据。它包含更多我感兴趣的变量。它看起来像这样:
Gaze Data - IviewTimestamp 649261961 OpenSesameTimeStamp 55191.0 GazeLeft 0.0 0.0 GazeRight 0.0 0.0 DistanceRight 530.630058679 DiameterLeft 4.89342033646 DiamaterRight 4.44607910548
然而,当我使用函数read_table2
时,它只会找到在校准过程中收集的变量。这是因为 R 仅查看 .txt 文件的前 1000 行来确定变量。我希望它跳到包含 "iviewTimestamp" 的第一行,因此它只导入 .txt 文件的相关部分并自动找到正确的变量。由于每个主题的校准长度不相等,因此无法跳到固定数字。
我该怎么做?
大约:使用grep()
找到所需字符串的第一个位置,然后使用read_table2
的skip
参数。
firstline <- grep("IviewTimestamp",readLines("file.txt"))[1]
readLines()
读取文件的整个文本,作为字符向量(文件每行一个元素); grep
returns 包含指定字符串(或正则表达式)的行的索引; [1]
提取包含字符串的 第 行的索引。现在您可以使用它来找到合适的位置开始阅读:
read_table2("file.txt", skip=firstline-1)
这是低效的(因为您需要读取文件两次),但我想每个文件花费的时间不到一秒钟。在 Unix 或 Unix-alike OS 上工作的更笨重但更有效的解决方案是使用 system()
到 运行 外部(更有效)grep
命令.
我建议您导入数据并在之后整理,而不是阅读两次。
首先导入目录中的所有文件:
library(dplyr)
library(purrr)
df <- map_df(list.files(path = path, pattern = '*.txt', full.names = TRUE), read_table2)
这里值得注意的是,您可以在调用 'read_table2'.
后添加可选参数,例如 col_names
等
导入所有文本文件后,可以对其进行过滤:
filter(df, 'timeStampColumnName' == IviewTimestamp)
我想对 100 多个 .txt 文件进行计算。这些文件包含使用眼动仪收集的注视数据。
数据的第一部分是校准部分。它只包含有限数量的变量。每行看起来像这样(大约 20 000 行):
Event: Data - startTime 1563518990 endTime 1563619015 Gaze 885.638118989 316.57751978
数据的第二部分包含在凝视测试期间收集的实际凝视数据。它包含更多我感兴趣的变量。它看起来像这样:
Gaze Data - IviewTimestamp 649261961 OpenSesameTimeStamp 55191.0 GazeLeft 0.0 0.0 GazeRight 0.0 0.0 DistanceRight 530.630058679 DiameterLeft 4.89342033646 DiamaterRight 4.44607910548
然而,当我使用函数read_table2
时,它只会找到在校准过程中收集的变量。这是因为 R 仅查看 .txt 文件的前 1000 行来确定变量。我希望它跳到包含 "iviewTimestamp" 的第一行,因此它只导入 .txt 文件的相关部分并自动找到正确的变量。由于每个主题的校准长度不相等,因此无法跳到固定数字。
我该怎么做?
大约:使用grep()
找到所需字符串的第一个位置,然后使用read_table2
的skip
参数。
firstline <- grep("IviewTimestamp",readLines("file.txt"))[1]
readLines()
读取文件的整个文本,作为字符向量(文件每行一个元素); grep
returns 包含指定字符串(或正则表达式)的行的索引; [1]
提取包含字符串的 第 行的索引。现在您可以使用它来找到合适的位置开始阅读:
read_table2("file.txt", skip=firstline-1)
这是低效的(因为您需要读取文件两次),但我想每个文件花费的时间不到一秒钟。在 Unix 或 Unix-alike OS 上工作的更笨重但更有效的解决方案是使用 system()
到 运行 外部(更有效)grep
命令.
我建议您导入数据并在之后整理,而不是阅读两次。
首先导入目录中的所有文件:
library(dplyr)
library(purrr)
df <- map_df(list.files(path = path, pattern = '*.txt', full.names = TRUE), read_table2)
这里值得注意的是,您可以在调用 'read_table2'.
后添加可选参数,例如col_names
等
导入所有文本文件后,可以对其进行过滤:
filter(df, 'timeStampColumnName' == IviewTimestamp)