我目前在尝试从9个.csv文件中读取和操作数据时遇到了问题,我能够用1来完成它,但是我不知道如何处理9个数据文件。下面是关于我是如何使用1个数据文件完成的代码,我发现重复它9次是不切实际的。有人能告诉我吗?
有9个不同的文件名:
到目前为止,我已经设法将文件名存储在向量中,但我似乎无法读取它。
string fileNames;
ifstream infile;
vector <string> vecFileNames
{
"Jan20071toDec31abcdefghijklmnopq.csv",
"Jan20081toDec31abcdefghijklmnopq.csv",
"Jan20091toDec31abcdefghijklmnopq.csv",
"MetData_Jan01-2010-Jan01-2011-ALL.csv",
"MetData_Jan01-2011-Jan01-2012-ALL.csv",
"MetData_Jan01-2012-Jan01-2013-ALL.csv",
"MetData_Jan01-2013-Jan01-2014-ALL.csv",
"MetData_Jan01-2014-Jan01-2015-ALL.csv",
"MetData_Jan01-2015-Jan01-2016-ALL.csv"
};
for (unsigned i = 0; i < vecFileNames.size(); i++)
{
fileNames = vecFileNames[i];
cout << fileNames << endl;
infile(fileNames); // <- Having problems
}添加(这是数据格式化的方式)
UTC Dp Dta Dts EV QFE QFF QNH RF RH S SR ST1 ST2 ST3 ST4 Sx T
2006年12月31日1:00 9.3 50 16 934.6 1009 1012.4 1012.6 0 32.1 9 657 25.4 28.7 28.1 26 13 27.44
编辑
下面是我已经尝试过的,我创建了一个日期和时间类,我必须使用它,所以我编辑了一些输出和输入。我创建了一个带有1条记录的csv文件,但是编译后没有出现错误,但是没有显示任何记录。
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <map>
#include <iterator>
#include <utility>
#include <vector>
#include "binaryTreeType.h"
#include "bSearchTreeType.h"
#include "Data.h"
#include "Date.h"
#include "Time.h"
std::istream &operator>>(std::istream &is, char const *delim) {
if (is.flags() & std::ios::skipws) {
while (isspace((unsigned char)is.peek()))
is.ignore(1);
}
while (*delim && *delim == is.peek()) {
++delim;
is.ignore(1);
}
if (*delim)
is.setstate(std::ios::failbit);
return is;
}
struct record
{
int day, month, year;
int hour, minutes;
double dp, ev, qfe, qff, qnh, rh, st[4], t;
int dta, dts, rf, s, sr, sx;
friend std::istream &operator>>(std::istream &is, record &r) {
is >> r.day >> "/" >> r.month >> "/" >> r.year >> " " >> r.hour >> ":"
>> r.minutes >> "," >> r.dp >> "," >> r.dta >> "," >> r.dts >> "," >> r.ev
>> "," >> r.qfe >> "," >> r.qff >> "," >> r.qnh >> "," >> r.rf >> "," >>
r.rh >> "," >> r.s >> "," >> r.sr;
for (int i = 0; i < 4; i++)
{
is >> "," >> r.st[i];
}
is >> r.sx >> "," >> r.t;
return is;
}
friend std::ostream &operator<<(std::ostream &os, record const &r) {
os << r.day << "/" << r.month << "/" << r.year << " " << r.hour << ":"
<< r.minutes << "," << r.dp << "," << r.dta << "," << r.dts << "," << r.ev
<< "," << r.qfe << "," << r.qff << "," << r.qnh << "," << r.rf << ","
<< r.rh << "," << r.s << "," << r.sr;
for (int i = 0; i < 4; i++)
{
os << "," << r.st[i];
}
os << r.sx << "," << r.t;
return os;
}
};
template <class Container>
void read_data(std::string const &name, Container &c) {
std::ifstream in(name);
record temp;
while (in >> temp)
{
c.push_back(temp);
}
}
using namespace std;
int main()
{
vector <string> filenames
{
"Test.csv"
//"Jan20071toDec31abcdefghijklmnopq.csv",
//"Jan20081toDec31abcdefghijklmnopq.csv",
//"Jan20091toDec31abcdefghijklmnopq.csv",
//"MetData_Jan01-2010-Jan01-2011-ALL.csv",
//"MetData_Jan01-2011-Jan01-2012-ALL.csv",
//"MetData_Jan01-2012-Jan01-2013-ALL.csv",
//"MetData_Jan01-2013-Jan01-2014-ALL.csv",
//"MetData_Mar01-2014-Mar01-2015-ALL.csv",
//"MetData_Mar01-2015-Mar01-2016-ALL.csv"
};
vector <record> data;
for (auto && s : filenames)
{
read_data(s, data);
}
for (auto const &r : data)
{
cout << r << "\n";
}发布于 2017-07-11 03:44:04
将代码放入函数中,并将文件名作为参数传递给函数:
void read_data(std::string const &filename) {
ifstream infile(filename);
// code to read dates
}那你就可以叫九遍了:
std::vector<std::string> filenames {
"Jan20071toDec31abcdefghijklmnopq.csv",
"Jan20081toDec31abcdefghijklmnopq.csv",
"Jan20091toDec31abcdefghijklmnopq.csv",
"MetData_Jan01-2010-Jan01-2011-ALL.csv",
"MetData_Jan01-2011-Jan01-2012-ALL.csv",
"MetData_Jan01-2012-Jan01-2013-ALL.csv",
"MetData_Jan01-2013-Jan01-2014-ALL.csv",
"MetData_Jan01-2014-Jan01-2015-ALL.csv",
"MetData_Jan01-2015-Jan01-2016-ALL.csv"
};
for (auto && s : filenames)
read_data(s);然后,您可能想要查找std::get_time。它会让你更容易地读到日期。哦,使用while (!whatever.eof())几乎总是一个错误(包括这里的代码)。
只是为了笑笑,我创建了几个测试文件,这些测试文件的数据形式略显简略,格式如下:
4/4/2017 1:40, 54321, 5432, 543, 54, 5
17/4/2017 12:47, 1, 12, 123, 1234, 12345 我将其中的一行放在两个文件中,然后运行以下代码:
#include <vector>
#include <string>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <fstream>
std::istream &operator>>(std::istream &is, char const *delim) {
if (is.flags() & std::ios::skipws) {
while (isspace((unsigned char)is.peek()))
is.ignore(1);
}
while (*delim && *delim == is.peek()) {
++delim;
is.ignore(1);
}
if (*delim)
is.setstate(std::ios::failbit);
return is;
}
struct record {
tm date;
int dp, dta, dts, ev, qfe; // , qff, qnh, rf, rh, s, sr, st[4], sx, t;
friend std::istream &operator>>(std::istream &is, record &r) {
is >> std::get_time(&r.date, "%d / %m / %Y %H : %M");
is >> "," >> r.dp >> "," >> r.dta >> "," >> r.dts >> "," >> r.ev >> "," >> r.qfe;
// >> "," >> r.qff >> "," >> r.qnh >> "," >> r.rf << "," >> r.rh >> "," >> r.s >> "," >> r.sr;
// for (int i = 0; i < 4; i++)
// is >> "," >> r.st[i];
// is >> r.sx >> "," >> r.t;
return is;
}
friend std::ostream &operator<<(std::ostream &os, record const &r) {
os << std::put_time(&r.date, "%Y/%m/%d %H:%M");
os << "," << r.dp << "," << r.dta << "," << r.dts << "," << r.ev << "," << r.qfe;
// << "," << r.qff << "," << r.qnh << "," << r.rf << "," << r.rh << "," << r.s << "," << r.sr;
// for (int i = 0; i < 4; i++)
// os << "," << r.st[i];
// os << r.sx << "," << r.t;
return os;
}
};
template <class Container>
void read_data(std::string const &name, Container &c) {
std::ifstream in(name);
record temp;
while (in >> temp)
c.push_back(temp);
}
int main() {
std::vector<std::string> filenames{
"Jan20071toDec31abcdefghijklmnopq.csv",
// "Jan20081toDec31abcdefghijklmnopq.csv",
// "Jan20091toDec31abcdefghijklmnopq.csv",
// "MetData_Jan01-2010-Jan01-2011-ALL.csv",
// "MetData_Jan01-2011-Jan01-2012-ALL.csv",
// "MetData_Jan01-2012-Jan01-2013-ALL.csv",
// "MetData_Jan01-2013-Jan01-2014-ALL.csv",
// "MetData_Jan01-2014-Jan01-2015-ALL.csv",
"MetData_Jan01-2015-Jan01-2016-ALL.csv"
};
std::vector<record> data;
for (auto && s : filenames)
read_data(s, data);
for (auto const &r : data)
std::cout << r << "\n";
}其结果是:
2017/04/17 12:47,1,12,123,1234,12345
2017/04/04 01:40,54321,5432,543,54,5请注意,我对输出数据进行了一些重新格式化(例如,将其从day/month/year更改为year/month/day)。让它使用更多的数据字段应该是类似代码的更多重复(同样,让它处理更多的文件应该主要是不注释文件名的问题)。
https://stackoverflow.com/questions/45024926
复制相似问题