之所以将所有变量压缩为一个,是因为输入文件中没有制表符。请尝试其中一种。
1) read.fwf 该文件具有固定宽度的字段,因此请使用read.fwf 指定字段宽度作为第二个参数。没有使用任何包。
u <- "https://raw.githubusercontent.com/Patricklv/Importing-.txt-file/master/Sample.txt"
widths <- c(13, rep(8, 9))
read.fwf(u, widths)
给予:
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1 201701001 011 236 240 236 226 224 238 239 240 232
2 201701001 111 299 285 237 252 227 249 237 233 238
3 201701001 211 287 292 296 230 237 234 235 254 251
4 201701001 311 286 287 311 283 237 240 226 240 246
5 201701001 411 270 273 282 318 277 243 248 236 243
6 201701001 511 279 276 284 280 305 285 262 249 241
7 201701001 611 288 284 286 281 272 299 284 257 238
8 201701001 711 293 290 292 284 269 278 298 282 257
9 201701001 811 314 305 290 298 267 265 282 292 277
10 201701001 911 314 310 310 295 288 270 261 292 292
11 2017010011011 308 311 321 309 281 277 270 250 301
12 2017010011111 325 319 312 332 303 287 294 275 254
正如我们在上面所做的那样,手动计算字段似乎很容易,但它可以从第一行数据L1 自动完成,方法是定位字段末端ends,它出现在一个数字后面两个或多个空格 (\\d +) 或 (|) 后跟一个数字,后跟行尾 (\\d$)。重要的是至少有两个空格,因为一个空格可以出现在第一个字段中。最后,字段宽度widths 是ends 的第一个组成部分,然后是ends 中连续位置的差异。
L1 <- readLines(u, 1)
ends <- gregexpr("\\d |\\d$", L1)[[1]]
widths <- c(ends[1], diff(ends))
2) 这是另一种选择。由于单个空格可以出现在第一个字段中,并且所有实际分隔符至少包含 2 个空格,我们可以在文件中读取,因此将所有出现的 2 个或更多空格替换为逗号,然后使用逗号分隔符读取。 u 来自上方。这有点长,但仍然只有一行,并且无需计算字段宽度。没有使用任何包。
read.table(text = gsub(" +", ",", readLines(u)), sep = ",")
3) 另一种选择可以基于这样一个事实,即我们已经从问题中知道第一个字段是 13 个字符,其余字段由空格很好地分隔,因此选择第一个字段并cbind 其他人使用read.table 重新阅读其余部分。同样,没有使用任何包。
L <- readLines(u)
cbind(V0 = substring(L, 1, 13), read.table(text = substring(L, 14)))