R read.xlsx注释字符选项

时间:2018-07-26 01:34:17

标签: r import

我正在使用read.xlsx软件包中的openxlsx函数。简而言之,我想知道是否有任何方法可以识别工作表中的注释标题。

例如,如果工作表看起来很喜欢

# information about data
ID    Value
A    10
B    3
C    19

我希望能够以类似的方式使用read.xlsx,我将read.delim用于.txt文件,并使用了comment.char = "#"选项,但是对于read.xlsx不存在。 / p>

## ideal code    
df <- read.xlsx("data.xlsx", sheet = 1, comment.char = "#")

我显然可以使用startRow选项,但这需要我手动查看每张纸并确定有多少条注释行。

我的解决方法是考虑如何查看工作表并返回开头包含#的行数,然后将此变量传递给startRow选项。关于如何/是否可行的任何想法?还是我错过的任何其他功能/选项?

2 个答案:

答案 0 :(得分:2)

您可以为read.xlsx编写自己的包装函数,以处理这种情况,就像这样...

这假设Book1.xlsx在第一张纸中包含您的示例数据。

private void On_ProcessExit(object sender, System.EventArgs e)
        {
            Console.WriteLine("Server has crashed...");
            _Proc.Exited -= new EventHandler(On_ProcessExit);

            DB.UpdateActivePID(ServerName, 0);

            if (_UserStop == true && _Proc.HasExited) {return; } //No need to restart server
            else if (_UserStop == false && _Proc.HasExited) //Need to restart the server
            {
                Start();
            }
        }


public static MySqlConnection Connection
        {
            get
            {
                if(connection == null)
                    Open();
                IsConnected();
                return connection;
            }
        }

public static MySqlCommand PrepareCommand(string query, object[] bindings)
        {
            for (int i = 0; i < bindings.Length; i++)
            {
                var regex = new Regex(Regex.Escape("?"));
                query = regex.Replace(query, "@param" + i, 1);
            }

            var cmd = Connection.CreateCommand();
            cmd.CommandText = query;
            cmd.Prepare();
            int index = 0;
            foreach (object o in bindings)
            {
                cmd.Parameters.AddWithValue("@param" + index, o);
                index++;
            }
            return cmd;
        }

  public static void ExecuteUpdate(string query, params object[] bindings)
        {
            if (Connection == null) return;

            MySqlCommand cmd = PrepareCommand(query, bindings);
            Console.WriteLine("SQL Line: " + cmd.CommandText);
            cmd.ExecuteNonQuery();
        }
public static void UpdateActivePID(string serverName, int pid)
        {
            if (Connection == null) return;
            string query = "UPDATE ServerParameters SET ActivePID = ? WHERE ServerName = ?";
            ExecuteUpdate(query, new object[] { pid,serverName } );
        }

请注意,library(openxlsx) wb_file <- "Book1.xlsx" wb <- loadWorkbook(wb_file) #custom function to skip header comment rows read.xlsx.skip.comment <- function(wb, comment.char = "#", ...){ #read data from sheet 1 shx <- read.xlsx(wb, ...) #count comment rows skip.rows <- grep(paste0("^", comment.char), c(names(shx)[1], shx[ , 1])) #skip comment header rows if they exist if(length(skip.rows) > 0) shx <- read.xlsx(wb, startRow = max(skip.rows) + 1, ...) return(shx) } #call the function, use default comment.char foo <- read.xlsx.skip.comment(wb = wb, sheet = 1) 可以指定其他read.xlsx参数(例如工作表)。

答案 1 :(得分:0)

能否请您尝试以下操作,如果有帮助,请告诉我。

mydat1 <- read.table('C:\\my_path\\file.txt', comment.char = '', header = FALSE)
mydat1

让我们说以下是我们的测试Input_file:

##1
12
123
1234

未设置comment.char = ''的输出如下:

mydat1 <- read.table('C:\\my_path_test\\file.txt', header = FALSE)
mydat1
> mydat1
    V1
1   12
2  123
3 1234

通过以下命令将comment.char设置为NULL,将输出( OP必需的 )。

mydat1 <- read.table('C:\\my_path_test\\file.txt', comment.char = '', header = FALSE)
mydat1
> mydat1
    V1
1  ##1
2   12
3  123
4 1234