Может ли R читать нестандартный xlsx?

введите здесь описание изображения

У меня так много (около 1000) xlsx, как на картинке выше. И я хочу прочитать каждый xlsx и получить данные имени, номера и возраста каждого кандидата. Но я не знаю, как читать этот нестандартный xlsx?


person Jingnan Lai    schedule 26.09.2017    source источник
comment
Итак, вам нужна первая строка каждого файла xlsx?   -  person Andre Elrico    schedule 26.09.2017
comment
@AndreElrico, ну, да, я не могу использовать read.xlsx для чтения такого типа xlsx, и он возвращает что-то неправильно. Но read.csv может это сделать, я не знаю, почему   -  person Jingnan Lai    schedule 26.09.2017


Ответы (2)


Я не знаю, достаточно ли умен какой-либо R Excel API, чтобы справиться с форматированием вашего столбца, но есть простой обходной путь. Вы можете просто сохранить приведенный выше рабочий лист в формате CSV. Выполнение этого для данных, которые вы показали выше, оставило меня со следующими тремя строками CSV:

Title,,,,,
name,mike,number,123214,age,28
,score,,ddd,aaa,bbb

Вы можете попробовать следующий код:

df <- read.csv(file="path/to/your/file.csv", header=FALSE)
df <- df[2:nrow(df), ]      # drop first row

Чтобы получить имя, номер и возраст Майка:

name   <- df[1, 2]
number <- df[1, 4]
age    <- df[1, 6]
person Tim Biegeleisen    schedule 26.09.2017
comment
Спасибо. На самом деле я использую read.xlsx для чтения этих xlsx, но не могу, но теперь я обнаружил, что read.csv может справиться с этим. - person Jingnan Lai; 26.09.2017

Вы можете запустить код VBA в Excel и преобразовать любое количество файлов XLSX в файлы CSV. Затем прокрутите все файлы CSV, чтобы объединить их во фрейм данных в R.

Sub Convert_Excel_To_CSV()
    Dim MyPath As String, FilesInPath As String
    Dim MyFiles() As String, Fnum As Long
    Dim mybook As Workbook
    Dim CalcMode As Long
    Dim sh As Worksheet
    Dim ErrorYes As Boolean
    Dim LPosition As Integer

    'Fill in the path\folder where the Excel files are
    MyPath = "C:\Users\Ryan\Desktop\Excel_Files\"

    FilesInPath = Dir(MyPath & "*.xlsx*")
    If FilesInPath = "" Then
        MsgBox "No files found"
        Exit Sub
    End If

    Fnum = 0
    Do While FilesInPath <> ""
        Fnum = Fnum + 1
        ReDim Preserve MyFiles(1 To Fnum)
        MyFiles(Fnum) = FilesInPath
        FilesInPath = Dir()
    Loop

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
        .EnableEvents = False
    End With

    If Fnum > 0 Then
        For Fnum = LBound(MyFiles) To UBound(MyFiles)
            Set mybook = Nothing
            On Error Resume Next
            Set mybook = Workbooks.Open(MyPath & MyFiles(Fnum))
            On Error GoTo 0

            If Not mybook Is Nothing Then


                    LPosition = InStr(1, mybook.Name, ".") - 1
                    mybookname = Left(mybook.Name, LPosition)
                    mybook.Activate
                    'All XLSX Files get saved in the directory below:
                    ActiveWorkbook.SaveAs Filename:="C:\your_path_here\" & mybookname & ".csv" _
                        , FileFormat:=xlCSVMSDOS, _
                        CreateBackup:=False

            End If

            mybook.Close SaveChanges:=False

        Next Fnum
    End If

    If ErrorYes = True Then
        MsgBox "There are problems in one or more files, possible problem:" _
             & vbNewLine & "protected workbook/sheet or a sheet/range that not exist"
    End If

    With Application
        .ScreenUpdating = True
        .EnableEvents = True
        .Calculation = CalcMode
    End With
End Sub






setwd("C:/your_path")
fnames <- list.files()
csv <- lapply(fnames, read.csv)
result <- do.call(rbind, csv)


********  ********  ********  ********  ********  ********  ********  ********  


filedir <- setwd("C:/your_path")
file_names <- dir(filedir)
your_data_frame <- do.call(rbind,lapply(file_names,read.csv))


********  ********  ********  ********  ********  ********  ********  ********  


filedir <- setwd("C:/your_path")
file_names <- dir(filedir)
your_data_frame <- do.call(rbind, lapply(file_names, read.csv, skip = 1, header = FALSE))


********  ********  ********  ********  ********  ********  ********  ********  


filedir <- setwd("C:/your_path")
file_names <- dir(filedir)
your_data_frame <- do.call(rbind, lapply(file_names, read.csv, header = FALSE))


********  ********  ********  ********  ********  ********  ********  ********  


# 
temp <- setwd("C:/your_path")
temp = list.files(pattern="*.csv")
myfiles = lapply(temp, read.delim)
person ASH    schedule 27.09.2017