首页 > 解决方案 > 这是编码问题吗?

问题描述

我下载了一个文本文件,它基本上包含两列——日期列和内容列。

日期列最初的格式为:mm/dd/yy h:mm:ss am/pm. 例如,一个这样的日期是10/16/2018 8:10:10 PM

我想隔离正常日期。我使用命令拆分文本列strsplit(),所以现在我有一个带有通用mm/dd/yy格式日期的向量。我想使用命令转换它as.Date(x, format = '%m/%d/%y)

然而,我注意到,我的大部分字符向量都以NA. 我将这些NA值与它周围的值进行了比较。这是我看到的:

normal_vector[1:3]
[1] "10/12/17" "‎10/12/17" "10/12/17"

**中间的(normal_vector[2])是问题之一。**

as.Date(normal_vector[1:3], format = "%m/%d/%y")
[1]  "2017-10-12" NA           "2017-10-12"

这可能是编码问题吗?我尝试使用,as.Date(iconv(normal_vector[1:3], to = "UTF-8"), format = "%m/%d/%y")但它似乎没有帮助。此外,如果我检查字符向量的编码,我会得到以下信息:

Encoding(normal_vector[1:3])
[1] "unknown" "UTF-8"   "unknown"

同样,我只想将所有这三个元素转换为 R 中的普通日期对象。它们看起来相同,并且编码会让我认为“UTF-8”字符很容易被as.Date()函数处理。它拒绝转换为日期的一些可能原因是什么?

谢谢!

标签: rencodingcharacter-encodingiconvas.date

解决方案


你的第二个字符串中确实有一些奇怪的字符(三个“点”)看看十六进制e280 8e 在此处输入图像描述

freaddata.table-package 可以很好地阅读这些文本...

data.table::fread("./temp.csv", header = FALSE)
#          V1          V2       V3
# 1: 10/12/17 ‎10/12/17 10/12/17

阅读后,您可以使用一些正则表达式魔法清理您的数据...

dt <- data.table::fread("./temp.csv", header = FALSE)
#          V1          V2       V3
# 1: 10/12/17 ‎10/12/17 10/12/17

#strip all NON 0-9, a-z, A-z AND '/' -characters
cleaned <- as.character( gsub( "[^0-9a-zA-Z/]", "", as.matrix( dt ) ) )

as.Date( cleaned, format = "%m/%d/%y" )
# [1] "2017-10-12" "2017-10-12" "2017-10-12"

推荐阅读