只读大文本文件中满足特定条件的行

Posted

技术标签:

【中文标题】只读大文本文件中满足特定条件的行【英文标题】:Read only lines from a large text file which fulfill specific condition 【发布时间】:2017-03-11 05:42:22 【问题描述】:

我有一个包含 3 列的大文件(data.txt,35 GB)。 该文件的一些示例部分如下所示:

...   ...    ...
5   701565  8679.56
8   1.16201e+006    3193.18
1   1.16173e+006    4457.85
14  1.16173e+006    4457.85
9   1.77942e+006    7208.73
4   1.78011e+006    8239.88
14  1.78019e+006    8195.57
9   2.00206e+006    8858.55
4   2.00199e+006    7924
...   ...    ...

当第二列中的值介于 0 和 50'000 之间时,我想为第三列绘制直方图。

然后我想做另一个直方图,其中第一列的值在 50'000 和 100'000 之间。以此类推。

我不知道如何一次只加载/读取我需要的数据。任何帮助将不胜感激!

如果我应该使用 sqldf 包,那么我的问题是我怎么能说第二列的值应该小于例如50'000?

与How do i read only lines that fulfil a condition from a csv into R? 的区别在于我没有任何列名。因此,我无法按照他们在解决方案中提出的建议:

sql = "从 Sepal.Length > 5 的文件中选择 *"

【问题讨论】:

也许您可以为此使用sqldf 包。请参阅these search results 以获得一些灵感。 我没有任何列名。因此我不知道如何使用 sqldf 进行子集化? 您是否考虑过仅命名 csv 文件中的列? csv 的结构非常简单,你可以只使用 Notepad++... 您可以尝试: 1. 创建新的 txt 文件(称为 aaa,因此它位于文件夹的顶部) 2. 打开并放置上面的第一行 3. 将文件从 txt 重命名为扩展名 csv 4. 将两个文件放在一个文件夹中 5. 通过命令合并文件(Windows 例如link)。这将创建一个具有适当列的新 csv 文件。有点hacky,但我以前在类似的问题中使用过它。 @Fabi;查看链接副本中 Dirk 的答案 - 它不使用列标题 【参考方案1】:

我认为readr 的最新版本支持这种事情。以下内容仅改编自readr::read_csv_chunked的帮助

library(readr)

f <- function(x, pos) subset(x, X3 > 0 & X3 < 50000)
df <- read_csv_chunked(
  'test.csv', 
  DataFrameCallback$new(f),
  chunk_size = 100000,
  col_names = F
)

【讨论】:

以上是关于只读大文本文件中满足特定条件的行的主要内容,如果未能解决你的问题,请参考以下文章

导入文本文件以处理特定列

如何通过特定的行分隔符读取文本文件?

如何根据给定的行数范围从文本文件中分割数据

读取大文本文件VB6中的行数

通过两个文本文件中的特定模式获取差异文件

vim文本编辑