【发布时间】:2015-10-03 21:23:02
【问题描述】:
我是编程和 ROOT (CERN) 的新手,所以请放轻松。简单地说,我想将约 900 MB(11M 行 x 10 列)的 .csv 文件转换为组织良好的 .root TTree。有人可以提供解决此问题的最佳方法吗?
这是一个带有标题的示例数据行(它是 2010 年美国人口普查区的人口和人口密度数据):
"人口普查县代码","人口普查区域代码","人口普查区块代码","县/州","区块质心纬度 (度)","区块质心 W 经度 (度)","区块土地面积(sq mi)","街区土地面积 (sq km)","街区人口","街区人口密度 (人/平方公里)"
1001,201,1000,Autauga AL,32.469683,-86.480959,0.186343,0.482626154,61,126.3918241
我已经粘贴了我到目前为止写的内容。
我在运行时特别想不通这个错误:“C:41:1: error: unknown type name ‘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();
}`
【问题讨论】:
-
Stackoverflow 问题需要展示您尝试过的内容并针对特定问题提出问题。 “给我代码”类型的问题往往不会被很好地接受。无论如何,您所说的“宏观”是什么意思?您已标记此 C 和 C++,因此您是否希望编写一个预处理器宏来执行您想要的操作。我认为这不会以任何合理的方式实用。
-
对不起,我是新手。宏基本上是指功能。那不是等价的吗?我已经编辑了帖子以显示我到目前为止所写的内容。
-
@user3502552 C/C++ 中的术语“宏”总是指使用
#define的预处理器定义。它绝对不等同于一个函数。 -
代码运行了,但我刚刚意识到我刚刚创建了一个空的 ntuple...其中没有数据...天哪。我真的不擅长这个
-
澄清行话:在 CERN 物理学界,“宏”是一段半一次性的代码,通常用于制作绘图。一般来说,它需要糟糕的编程实践。
标签: c++ csv bigdata root-framework