如何从文件中提取数字数据并在R中创建数据帧

如何从文件中提取数字数据并在R中创建数据帧,r,R,下面是我的文件的一个示例模板,我想在其中提取数字数据并创建一个数据框架(文件名:mylog.log) 文件内容 ***************************************************************** ****** option summary ****** runlvl = 3 bypass = 2 Opening plot unit= 15 file=new_run.pa0 ******

下面是我的文件的一个示例模板,我想在其中提取数字数据并创建一个数据框架(文件名:mylog.log)

文件内容

*****************************************************************
 ******  option summary
 ******
 runlvl  = 3         bypass  = 2         
  Opening plot unit= 15
 file=new_run.pa0

 ******  
 

  ********  dc transfer curves tnom=  25.000 temp=  25.000 *****
x
        


     volt    current    
                    v0     
  1.0000e-01   -2.570e-11  
  2.0000e-01   -2.769e-11  
  3.0000e-01   -2.795e-11  
  4.0000e-01   -2.803e-11  
  5.0000e-01   -2.814e-11  
  6.0000e-01   -2.823e-11  
  7.0000e-01   -2.833e-11  
  8.0000e-01   -2.842e-11  
  9.0000e-01   -2.861e-11  
  1.0000e+00   -2.871e-11  
  1.1000e+00   -2.880e-11  
  1.2000e+00   -2.889e-11  
  1.3000e+00   -2.899e-11  
  1.4000e+00   -2.908e-11  
  1.5000e+00   -2.916e-11  
  1.6000e+00   -2.925e-11  
  1.7000e+00   -2.934e-11  
  1.8000e+00   -2.942e-11  
  1.9000e+00   -2.950e-11  
  2.0000e+00   -2.958e-11  
  2.1000e+00   -2.966e-11  
  2.2000e+00   -2.973e-11  
  2.3000e+00   -2.980e-11  
  2.4000e+00   -2.986e-11  
  2.5000e+00   -3.022e-11  
  2.6000e+00   -3.030e-11  
  2.7000e+00   -3.039e-11  
  2.8000e+00   -3.046e-11  
  2.9000e+00   -3.053e-11  
  3.0000e+00   -3.059e-11  
  3.1000e+00   -3.066e-11  
  3.2000e+00   -3.110e-11  
  3.3000e+00   -3.119e-11  
  3.4000e+00   -3.125e-11  
  3.5000e+00   -3.132e-11  
  3.6000e+00   -3.140e-11  
  3.7000e+00   -3.145e-11  
  3.8000e+00   -3.152e-11  
  3.9000e+00   -3.161e-11  
  4.0000e+00   -3.167e-11  
  4.1000e+00   -3.175e-11  
  4.2000e+00   -3.175e-11  
  4.3000e+00   -3.182e-11  
  4.4000e+00   -3.189e-11  
  4.5000e+00   -3.197e-11  
  4.6000e+00   -3.199e-11  
  4.7000e+00   -3.202e-11  
  4.8000e+00   -3.212e-11  
  4.9000e+00   -3.219e-11  
  5.0000e+00   -3.278e-11  
  5.1000e+00   -3.281e-11  
  5.2000e+00   -3.297e-11  
  5.3000e+00   -3.295e-11  
  5.4000e+00   -3.301e-11  
  5.5000e+00   -3.299e-11  
  5.6000e+00   -3.310e-11  
  5.7000e+00   -3.381e-11  
  5.8000e+00   -3.384e-11  
  5.9000e+00   -3.396e-11  
  6.0000e+00   -3.398e-11  
  6.1000e+00   -3.405e-11  
  6.2000e+00   -3.411e-11  
  6.3000e+00   -3.413e-11  
  6.4000e+00   -3.424e-11  
  6.5000e+00   -3.420e-11  
  6.6000e+00   -3.432e-11  
  6.7000e+00   -3.438e-11  
  6.8000e+00   -3.444e-11  
  6.9000e+00   -3.450e-11  
  7.0000e+00   -3.444e-11  
  7.1000e+00   -3.455e-11  
  3.9300e+01   -8.790e+00  
  3.9400e+01   -8.824e+00  
  3.9500e+01   -8.859e+00  
  3.9600e+01   -8.894e+00  
  3.9700e+01   -8.928e+00  
  3.9800e+01   -8.963e+00  
  3.9900e+01   -8.998e+00  
  4.0000e+01   -9.033e+00  
y

          ***** job concluded
 ****** HSPICE -- H-2013.03-SP2 32-BIT (Aug 26 2013) RHEL32 ******              
 ******  
 

  ******  job statistics summary tnom=  25.000 temp=  25.000 *****
  
  
 ******  Machine Information  ******
我想提取v0行下面的值,并创建一个两列数据框

Volt             Current
-100.00000m      406.5220f
"........................"
对于所有行,直到出现数字数据。事实上,线路电压和电流之前的线路数量是动态的,而数字数据传输之后的线路数量也是动态的。数值数据行也是动态的。可以考虑的一点是,数值数据总是在文件的下面两行之后开始

volt      current    
                        v0 
下面是我通过指定数据行号尝试的代码

DATA <- readLines(myfile)
  
  DataStartPos <- 314
  DataEndPos <- 1062
  
  
  #Seperate numeric data and META data and bind to data frame
  
    tmp <- as.data.frame(DATA[DataStartPos:DataEndPos])
    tmp <- separate(tmp, col = 1, c("S.No", "Volts", "Amps"), sep = "\\s+")

数据
fread
来自
数据。表
包将很好地工作。如果您只使用默认参数,它会给您一系列警告消息。如果您在指定要跳过的行数时非常小心,则可以减少警告消息的数量

#with a file
df <- fread(file ="path/to/target_file")
df
             V1        v0
# 1: -100.00000m 406.5220f
# 2: -200.00000m 806.6048f
# 3: -300.00000m   1.2066p
# 4: -400.00000m   1.6067p
# 5: -500.00000m   2.0067p
# 6: -600.00000m   2.4066p
# 7: -700.00000m   2.8066p
# 8: -800.00000m   3.2067p
# 9: -900.00000m   3.6067p
#10:    -1.00000   4.0067p
#11:    -1.10000   4.4067p
#12:    -1.20000   4.8068p
#13:    -1.30000   5.2069p
#14:    -1.40000   5.6068p
#15:    -1.50000   6.0070p
#16:    -1.60000   6.4069p
#17:    -1.70000   6.8070p
#18:    -1.80000   7.2069p
#19:    -1.90000   7.6070p
#20:    -2.00000   8.0069p
#21:    -2.10000   8.4071p
#22:    -2.20000   8.8070p
#23:    -2.30000   9.2071p
#24:    -2.40000 9.6070p**
#             V1        v0
所以你可以

df <- fread(file ="path/to/target_file", skip = "volt", col.names = c("volt","current"))
sed
命令多种多样,但此结构将打印/1/、/2/-特别是模式
x
y
之间的行。
^
表示该行的第一个字符应该是以下字符。
如果您知道
x
y
将是行中唯一的字符,则可以通过将命令
设置为“sed-n'/^x$/,/^y$/p'
使其更具体。同样,我不知道这是否适用于windows,但它适用于我的终端。

但要跳过的行数是动态的。我需要使用模式(“伏特电流”)和下一行(“v0”)来识别数值。我该怎么做?谢谢你的编辑。有没有办法提到终点线?数字行的数量也是动态的。数值数据总是在模式(“y”)之前结束。在您的示例中,我没有看到任何涉及“y”模式的内容,因此我不知道如何提供帮助
fread
文档表示,默认情况下,它将读取遵循可预测定界的最大行数
nrows
参数不是动态的,并且与
skip
参数没有相同的功能。我在问题中编辑了模式(“y”)。我得到了这个错误,df
df <- fread(file ="path/to/target_file", skip = "volt", col.names = c("volt","current"))
file_path <- "path/to/target_file"
fread(cmd = paste("sed -n '/^x/,/^y/p'", file_path), col.names = c("volt","current")