如何在维护回车和换行符的同时将XLSX文件导入R Dataframe?

时间:2018-03-20 15:29:50

标签: r dataframe xlsx xls

我想要摄取工作目录中的所有文件,并扫描所有行以换行或回车。我想将它们转移到一个新的输出文件中进行手动审查,而不是消除它们。这是我到目前为止所做的:

library(plyr)
library(dplyr)
library(readxl)


filenames <- list.files(pattern = "Sara Lee.*\\.xlsx$", ignore.case = TRUE)

read_excel_filename <- function(filename){
  ret <- read_excel(filename, col_names = TRUE, skip = 5, trim_ws = FALSE)
  ret
}

import.list <- ldply(filenames, read_excel_filename)

returnornewline <- import.list[((import.list$"CUSTOMER SEGMENT")=="[\r\n]"|(import.list$"SECTOR NAME")=="[\r\n]"|
                                 (import.list$"LOCATION NAME")=="[\r\n]"|(import.list$"LOCATION ID")=="[\r\n]"|
                                 (import.list$"ADDRESS")=="[\r\n]"|(import.list$"CITY")=="[\r\n]"|
                                 (import.list$"STATE")=="[\r\n]"|(import.list$"ZIP CODE")=="[\r\n]"|
                                 (import.list$"DISTRIBUTOR NAME")=="[\r\n]"|(import.list$"REDISTRIBUTOR NAME")=="[\r\n]"|
                                 (import.list$"TRANS DATE")=="[\r\n]"|(import.list$"DIST. INVOICE")=="[\r\n]"|
                                 (import.list$"ITEM MIN")=="[\r\n]"|(import.list$"ITEM LABEL")=="[\r\n]"|
                                 (import.list$"ITEM DESC")=="[\r\n]"|(import.list$"PACK SIZE")=="[\r\n]"|
                                 (import.list$"REBATEABLE UOM")=="[\r\n]"|(import.list$"QUANTITY")=="[\r\n]"|
                                 (import.list$"SALES VOLUME")=="[\r\n]"|(import.list$"X__1")=="[\r\n]"|
                                 (import.list$"X__2")=="[\r\n]"|(import.list$"X__3")=="[\r\n]"|
                                 (import.list$"VA PER")=="[\r\n]"|(import.list$"VA PER CODE")=="[\r\n]"|
                                 (import.list$"TOTAL REBATE")=="[\r\n]"|(import.list$"TOTAL ADMIN FEE")=="[\r\n]"|
                                 (import.list$"TOTAL INVOICED")=="[\r\n]"|(import.list$"STD VA PER")=="[\r\n]"|
                                 (import.list$"STD VA PER CODE")=="[\r\n]"|(import.list$"EXC TYPE CODE")=="[\r\n]"|
                                 (import.list$"EXC EXC VA PER")=="[\r\n]"|(import.list$"EXC VA PER CODE")=="[\r\n]"), ]


now <- Sys.time()

carriage_return_file_name <- paste(format(now,"%Y%m%d"),"ROWS with Carriage Returns or New Lines.csv",sep="_")
write.csv(returnornewline, carriage_return_file_name, row.names = FALSE)

以下是一些示例数据:

Customer Segment     Address
BuyFood             123 Main St.\r

BigKetchup          679 Smith Dr.\r

DownUnderMeat       410 Crocodile Way
BuyFood             123 Main St.

我认为trim_ws = FALSE条件会起作用,但它没有。

为列垃圾邮件道歉,我还没有找到一种更简单的方法来扫描所有列而不列出它们。关于这个问题的任何帮助也受到赞赏。

编辑:添加了一些示例数据。我不知道如何在除正则表达式之外的地址中显示回车符。它在真实的样本数据中看起来并不像那样,仅供我们在这里使用。如果不清楚,请告诉我。所需的输出将采用前两行数据,其中有一个回车符并将其输出到代码块末尾列出的csv文件。

编辑2:我使用建议中提供的代码代替原始的长列列表,如下所示。但是,这并没有给我一个新变量,它包含带有新行或回车符的行的数据框。当我在R Studio中查看我的全局环境时,我在Data下看到另一个名为“returnornewline”的变量,但它显示为一个大型列表,与显示数据帧的import.list变量不同。这不应该是这种情况,因为我只在数据的第一个电子表格的第一行添加了回车符,因此列表不应该太大。:

returnornewline <- lapply(import.list, function(x) lapply(x, function(s) grep("\r", s)))

# returnornewline <- import.list[((import.list$"CUSTOMER SEGMENT")=="[\r\n]"|(import.list$"SECTOR NAME")=="[\r\n]"|
#                                  (import.list$"LOCATION NAME")=="[\r\n]"|(import.list$"LOCATION ID")=="[\r\n]"|
#                                  (import.list$"ADDRESS")=="[\r\n]"|(import.list$"CITY")=="[\r\n]"|
#                                  (import.list$"STATE")=="[\r\n]"|(import.list$"ZIP CODE")=="[\r\n]"|
#                                  (import.list$"DISTRIBUTOR NAME")=="[\r\n]"|(import.list$"REDISTRIBUTOR NAME")=="[\r\n]"|
#                                  (import.list$"TRANS DATE")=="[\r\n]"|(import.list$"DIST. INVOICE")=="[\r\n]"|
#                                  (import.list$"ITEM MIN")=="[\r\n]"|(import.list$"ITEM LABEL")=="[\r\n]"|
#                                  (import.list$"ITEM DESC")=="[\r\n]"|(import.list$"PACK SIZE")=="[\r\n]"|
#                                  (import.list$"REBATEABLE UOM")=="[\r\n]"|(import.list$"QUANTITY")=="[\r\n]"|
#                                  (import.list$"SALES VOLUME")=="[\r\n]"|(import.list$"X__1")=="[\r\n]"|
#                                  (import.list$"X__2")=="[\r\n]"|(import.list$"X__3")=="[\r\n]"|
#                                  (import.list$"VA PER")=="[\r\n]"|(import.list$"VA PER CODE")=="[\r\n]"|
#                                  (import.list$"TOTAL REBATE")=="[\r\n]"|(import.list$"TOTAL ADMIN FEE")=="[\r\n]"|
#                                  (import.list$"TOTAL INVOICED")=="[\r\n]"|(import.list$"STD VA PER")=="[\r\n]"|
#                                  (import.list$"STD VA PER CODE")=="[\r\n]"|(import.list$"EXC TYPE CODE")=="[\r\n]"|
#                                  (import.list$"EXC EXC VA PER")=="[\r\n]"|(import.list$"EXC VA PER CODE")=="[\r\n]"), ]

编辑3:我需要能够获取新创建的数据框“import.list”中的所有行,并扫描它们以查找所有行中的回车或新行的任何实例。上面的例子很简陋,但概念就是这样。在示例中,我希望脚本读取前两行并说“嘿,这些行有回车符,将其添加到分配给此行代码的变量中,并在脚本末尾将此数据输出到一个csv。“上面的示例数据中的其余两行无需输出,因为它们的数据中没有回车符。

0 个答案:

没有答案