我是编程和 ROOT (CERN) 的新手,所以请放轻松。简单地说,我想将一个 ~900 MB(11M 行 x 10 列)的 .csv 文件转换成一个组织良好的 .root TTree。有人可以提供最好的方法吗?
这是带有标题的示例数据行(它是 2010 年美国人口普查区人口和人口密度数据):
"人口普查县代码","人口普查区域代码","人口普查街区代码","县/州","街区质心纬度 (度)","街区质心 W 经度 (度)","街区土地面积 (sq mi )","街区土地面积(平方公里)","街区人口","街区人口密度(人/平方公里)"
1001,201,1000,Autauga AL,32.469683,-86.480959,0.186343,0.482626154,61,126.3918241
我已经粘贴了我到目前为止所写的内容。
运行时我特别无法弄清楚这个错误:“C:41:1:错误:未知类型名称'UScsvToRoot'”。
这可能真的很愚蠢,但是您如何在 ROOT 中读取字符串(用于读取县/州名称)?比如数据类型是什么?我只需要使用char吗?我在发呆。
#include "Riostream.h"
#include "TString.h"
#include "TFile.h"
#include "TNtuple.h"
#include "TSystem.h"
void UScsvToRoot() {
TString dir = gSystem->UnixPathName(__FILE__);
dir.ReplaceAll("UScsvToRoot.C","");
dir.ReplaceAll("/./","/");
ifstream in;
in.open(Form("%sUSPopDens.csv",dir.Data()));
Int_t countyCode,tractCode,blockCode;
// how to import County/State string?
Float_t lat,long,areaMi,areaKm,pop,popDens;
Int_t nlines = 0;
TFile *f = new TFile("USPopDens.root","RECREATE");
TNtuple *ntuple = new TNtuple("ntuple","data from csv file","countyCode:tractCode:blockCode:countyState:lat:long:areaMi:areaKm:pop:popDens");
while (1) {
in >> countyCode >> tractCode >> blockCode >> countyState >> lat >> long >> areaMi >> areaKm >> pop >> popDens;
if (!in.good()) break;
ntuple->Fill(countyCode,tractCode,blockCode,countyState,lat,long,areaMi,areaKm,pop,popDens);
nlines++;
}
in.close();
f->Write();
}`