我正在使用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
选项。关于如何/是否可行的任何想法?还是我错过的任何其他功能/选项?
答案 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