I have a dataframe which has multiple tables, each table is signified by the empty rows in between.
A   x   y   z
Name1   12  21  23
Name2   23  21  22
Name3         
        
If possible, you should see if you can modify how you import your data to not have to do this. Otherwise here is a possible solution that creates a list where each element is one of your tables.
dt <- read.table(blank.lines.skip = FALSE,
                 text = "
A   x   y   z
Name1   12  21  23
Name2   23  21  22
Name3   45  43  21
B   x   y   z
Name4   32  23  23
Name5   12  32  33
Name6   10  34  45
Name12  11  11  56
C   x   y   z
Name7   11  56  67
Name8   90  87  98
Name9   45  34  34
Name10  78  8   56
Name11  92  12  45
", stringsAsFactors = FALSE)
## add column to indicate groups
dt$tbl_id <- cumsum(!nzchar(dt$V1))
## remove blank lines
dt <- dt[nzchar(dt$V1), ]
## split the data frame
dt_s <- split(dt[, -ncol(dt)], dt$tbl_id)
## use first line as header and reset row numbers
dt_s <- lapply(dt_s, function(x) {
    colnames(x) <- x[1, ]
    x <- x[-1, ]
    rownames(x) <- NULL
    x
})
Result:
> dt_s
$`1`
      A  x  y  z
1 Name1 12 21 23
2 Name2 23 21 22
3 Name3 45 43 21
$`2`
       B  x  y  z
1  Name4 32 23 23
2  Name5 12 32 33
3  Name6 10 34 45
4 Name12 11 11 56
$`3`
       C  x  y  z
1  Name7 11 56 67
2  Name8 90 87 98
3  Name9 45 34 34
4 Name10 78  8 56
5 Name11 92 12 45