固定宽度文件可以是数字数据的非常紧凑的表示。解析速度也非常快,因为每行中的每个字段都位于相同的位置。不幸的是,解析起来很痛苦,因为您需要说明每个字段的长度。 Readr 旨在通过提供多种不同的方式来说明字段结构,使其尽可能简单。
-
fwf_empty()
- 根据空列的位置进行猜测。 -
fwf_widths()
- 提供列的宽度。 -
fwf_positions()
- 提供起始位置和结束位置的成对向量。 -
fwf_cols()
- 提供成对的开始和结束位置或列宽的命名参数。
用法
read_fwf(
file,
col_positions = fwf_empty(file, skip, n = guess_max),
col_types = NULL,
col_select = NULL,
id = NULL,
locale = default_locale(),
na = c("", "NA"),
comment = "",
trim_ws = TRUE,
skip = 0,
n_max = Inf,
guess_max = min(n_max, 1000),
progress = show_progress(),
name_repair = "unique",
num_threads = readr_threads(),
show_col_types = should_show_types(),
lazy = should_read_lazy(),
skip_empty_rows = TRUE
)
fwf_empty(
file,
skip = 0,
skip_empty_rows = FALSE,
col_names = NULL,
comment = "",
n = 100L
)
fwf_widths(widths, col_names = NULL)
fwf_positions(start, end = NULL, col_names = NULL)
fwf_cols(...)
参数
- file
-
文件路径、连接或文字数据(单个字符串或原始向量)。
以
.gz
、.bz2
、.xz
或.zip
结尾的文件将自动解压缩。将自动下载以http://
、https://
、ftp://
或ftps://
开头的文件。远程gz文件也可以自动下载并解压。文字数据对于示例和测试最有用。要被识别为文字数据,输入必须用
I()
包装,是包含至少一个换行符的字符串,或者是至少包含一个带有换行符的字符串的向量。使用值
clipboard()
将从系统剪贴板读取。 - col_positions
-
列位置,由
fwf_empty()
、fwf_widths()
或fwf_positions()
创建。要仅读入选定的字段,请使用fwf_positions()
。如果最后一列的宽度是可变的(参差不齐的 fwf 文件),则将最后一个结束位置提供为 NA。 - col_types
-
NULL
、cols()
规范或字符串之一。有关更多详细信息,请参阅vignette("readr")
。如果是
NULL
,则所有列类型都将从输入的guess_max
行推断出来,散布在整个文件中。这很方便(而且快速),但不够稳健。如果猜测的类型错误,您需要增加guess_max
或自己提供正确的类型。由
list()
或cols()
创建的列规范必须为每一列包含一个列规范。如果您只想读取列的子集,请使用cols_only()
。或者,您可以使用紧凑的字符串表示形式,其中每个字符代表一列:
-
c = 字符
-
我 = 整数
-
n = 数字
-
d = 双
-
l = 逻辑
-
f = 因子
-
D = 日期
-
T = 日期时间
-
t = 时间
-
? = 猜猜
-
_ 或 - = 跳过
默认情况下,读取没有列规范的文件将打印一条消息,显示
readr
猜测的内容。要删除此消息,请设置show_col_types = FALSE
或设置 `options(readr.show_col_types = FALSE)。 -
- col_select
-
要包含在结果中的列。您可以使用与
dplyr::select()
相同的mini-language 来按名称引用列。使用c()
可以使用多个选择表达式。尽管这种用法不太常见,col_select
也接受数字列索引。有关选择语言的完整详细信息,请参阅?tidyselect::language
。 - id
-
用于存储文件路径的列的名称。当读取多个输入文件并且文件路径中有数据(例如数据收集日期)时,这非常有用。如果
NULL
(默认值)则不会创建额外的列。 - locale
-
区域设置控制默认值因地而异。默认区域设置为 US-centric(如 R),但您可以使用
locale()
创建自己的区域设置来控制默认时区、编码、小数标记、大标记和日/月名称等内容。 - na
-
要解释为缺失值的字符串的字符向量。将此选项设置为
character()
以指示没有缺失值。 - comment
-
用于标识评论的字符串。注释字符之后的任何文本都将被默默忽略。
- trim_ws
-
在解析每个字段之前是否应该删除前导和尾随空格(ASCII 空格和制表符)?
- skip
-
读取数据之前要跳过的行数。
- n_max
-
读取的最大行数。
- guess_max
-
用于猜测列类型的最大行数。永远不会使用超过读取的行数。有关更多详细信息,请参阅
vignette("column-types", package = "readr")
。 - progress
-
显示进度条?默认情况下,它只会在交互式会话中显示,而不会在编织文档时显示。可以通过将选项
readr.show_progress
设置为FALSE
来禁用自动进度条。 - name_repair
-
列名的处理。默认行为是确保列名称为
"unique"
。支持多种修复策略:-
"minimal"
:除了名称的基本存在之外,没有名称修复或检查。 -
"unique"
(默认值):确保名称唯一且不为空。 -
"check_unique"
:没有名称修复,但检查它们是unique
。 -
"universal"
:将名称命名为unique
并进行语法设置。 -
函数:应用自定义名称修复(例如,
name_repair = make.names
用于基本 R 样式的名称)。 -
purrr-style 匿名函数,请参阅
rlang::as_function()
。
此参数作为
repair
传递到vctrs::vec_as_names()
。有关这些条款以及用于执行这些条款的策略的更多详细信息,请参阅此处。 -
- num_threads
-
用于初始解析和延迟读取数据的处理线程数。如果您的数据在字段中包含换行符,解析器应自动检测到这一点并回退到仅使用一个线程。但是,如果您知道文件在带引号的字段中包含换行符,那么显式设置
num_threads = 1
是最安全的。 - show_col_types
-
如果是
FALSE
,则不显示猜测的列类型。如果TRUE
始终显示列类型,即使提供了列类型。如果NULL
(默认)仅在col_types
参数未显式提供列类型时显示列类型。 - lazy
-
懒惰地读取值?默认情况下,这是
FALSE
,因为延迟读取文件时有一些特殊的考虑因子,这导致了一些用户的错误。具体来说,读取然后写回同一个文件时,事情会变得很棘手。但是,一般来说,惰性读取 (lazy = TRUE
) 有很多好处,特别是对于交互式使用以及当您的下游工作仅涉及行或列的子集时。在
should_read_lazy()
和vroom::vroom()
的altrep
参数的文档中了解更多信息。 - skip_empty_rows
-
空白行应该被完全忽略吗?即,如果此选项是
TRUE
,则根本不会表示空白行。如果是FALSE
,则它们将由所有列中的NA
值表示。 - col_names
-
可以是 NULL,也可以是字符向量列名称。
- n
-
分词器将读取以确定文件结构的行数。默认情况下设置为 100。
- widths
-
每个字段的宽度。读取参差不齐的 fwf 文件时,使用 NA 作为最后一个字段的宽度。
- start, end
-
每个字段的开始和结束(包括)位置。读取参差不齐的 fwf 文件时,使用 NA 作为最后一个结束字段。
- ...
-
如果第一个元素是 DataFrame ,则它必须具有所有数字列以及一个或两个行。列名是变量名。如果长度为一向量,则列值是可变宽度;如果长度为二,则列值是可变开始和结束位置。
...
的元素用于构造一个具有或两行的 DataFrame ,如上所述。
也可以看看
read_table()
读取固定宽度的文件,其中每列由空格分隔。
例子
fwf_sample <- readr_example("fwf-sample.txt")
writeLines(read_lines(fwf_sample))
#> John Smith WA 418-Y11-4111
#> Mary Hartford CA 319-Z19-4341
#> Evan Nolan IL 219-532-c301
# You can specify column positions in several ways:
# 1. Guess based on position of empty columns
read_fwf(fwf_sample, fwf_empty(fwf_sample, col_names = c("first", "last", "state", "ssn")))
#> Rows: 3 Columns: 4
#> ── Column specification ──────────────────────────────────────────────────
#>
#> chr (4): first, last, state, ssn
#>
#> ℹ Use `spec()` to retrieve the full column specification for this data.
#> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#> # A tibble: 3 × 4
#> first last state ssn
#> <chr> <chr> <chr> <chr>
#> 1 John Smith WA 418-Y11-4111
#> 2 Mary Hartford CA 319-Z19-4341
#> 3 Evan Nolan IL 219-532-c301
# 2. A vector of field widths
read_fwf(fwf_sample, fwf_widths(c(20, 10, 12), c("name", "state", "ssn")))
#> Rows: 3 Columns: 3
#> ── Column specification ──────────────────────────────────────────────────
#>
#> chr (3): name, state, ssn
#>
#> ℹ Use `spec()` to retrieve the full column specification for this data.
#> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#> # A tibble: 3 × 3
#> name state ssn
#> <chr> <chr> <chr>
#> 1 John Smith WA 418-Y11-4111
#> 2 Mary Hartford CA 319-Z19-4341
#> 3 Evan Nolan IL 219-532-c301
# 3. Paired vectors of start and end positions
read_fwf(fwf_sample, fwf_positions(c(1, 30), c(20, 42), c("name", "ssn")))
#> Rows: 3 Columns: 2
#> ── Column specification ──────────────────────────────────────────────────
#>
#> chr (2): name, ssn
#>
#> ℹ Use `spec()` to retrieve the full column specification for this data.
#> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#> # A tibble: 3 × 2
#> name ssn
#> <chr> <chr>
#> 1 John Smith 418-Y11-4111
#> 2 Mary Hartford 319-Z19-4341
#> 3 Evan Nolan 219-532-c301
# 4. Named arguments with start and end positions
read_fwf(fwf_sample, fwf_cols(name = c(1, 20), ssn = c(30, 42)))
#> Rows: 3 Columns: 2
#> ── Column specification ──────────────────────────────────────────────────
#>
#> chr (2): name, ssn
#>
#> ℹ Use `spec()` to retrieve the full column specification for this data.
#> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#> # A tibble: 3 × 2
#> name ssn
#> <chr> <chr>
#> 1 John Smith 418-Y11-4111
#> 2 Mary Hartford 319-Z19-4341
#> 3 Evan Nolan 219-532-c301
# 5. Named arguments with column widths
read_fwf(fwf_sample, fwf_cols(name = 20, state = 10, ssn = 12))
#> Rows: 3 Columns: 3
#> ── Column specification ──────────────────────────────────────────────────
#>
#> chr (3): name, state, ssn
#>
#> ℹ Use `spec()` to retrieve the full column specification for this data.
#> ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#> # A tibble: 3 × 3
#> name state ssn
#> <chr> <chr> <chr>
#> 1 John Smith WA 418-Y11-4111
#> 2 Mary Hartford CA 319-Z19-4341
#> 3 Evan Nolan IL 219-532-c301
相关用法
- R readr read_file 读/写完整文件
- R readr read_rds 读/写 RDS 文件。
- R readr read_lines 从文件中读取/写入行
- R readr read_builtin 从包中读取内置对象
- R readr read_delim 将分隔文件(包括 CSV 和 TSV)读入 tibble
- R readr read_table 将空格分隔的列读入 tibble
- R readr read_log 将通用/组合日志文件读入 tibble
- R readr readr_example 获取 readr 示例的路径
- R readr datasource 创建源对象。
- R readr melt_delim 返回分隔文件中每个标记的熔化数据(包括 csv 和 tsv)
- R readr parse_number 灵活地解析数字
- R readr Tokenizers 分词器。
- R readr melt_table 返回空格分隔文件中每个标记的熔化数据
- R readr date_names 创建或检索日期名称
- R readr type_convert 重新转换现有 DataFrame 中的字符列
- R readr locale 创建语言环境
- R readr write_delim 将数据帧写入分隔文件
- R readr parse_vector 解析字符向量。
- R readr with_edition 暂时更改活动阅读器版本
- R readr format_delim 将 DataFrame 转换为分隔字符串
- R readr edition_get 检索当前活动版本
- R readr melt_fwf 返回固定宽度文件中每个标记的熔化数据
- R readr count_fields 计算文件每一行中的字段数
- R readr problems 检索解析问题
- R readr parse_guess 使用“最佳”类型进行解析
注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Read a fixed width file into a tibble。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。