1

得到了我的跳跃日志的这个 csv 文件,并希望在每个块中进行排序(跳跃记录),以便首先列出教练,其次是学生,最后是可选的摄影师。当前它们以各种顺序编写。

正在考虑读取块的每一行并将其分配到 vars 中,然后使用空白行作为循环控制进行打印。我在正确的轨道上吗?更喜欢 C++ 中的解决方案帮助(一点点 exp。和编译器设置),但我很灵活,希望在今年夏天真正了解任何推荐语言的具体细节。可能是 Python 或任何有一本好书介绍 CompSci 的人。

非常感谢任何建议和参考!

第一个 col 是角色:1,2,3。

角色(1,2,3),日期(yyymmdd),飞机升降机编号,名称角色1是串联教练,角色2是学生,角色3自由落体相机(可选)

1,20100124,C206WR-L1,MAC PETE

2,20100124,C206WR-L1,霍华德·斯蒂芬

3,20100124,C206WR-L1,JONES DAVE

,,,

2,20100124,C206WR-L3,ALLSOP BEX

1,20100124,C206WR-L3,MAC PETE

3,20100124,C206WR-L3,琼斯戴夫

,,,

1,20100124,C206WR-L2,MAC PETE

3,20100124,C206WR-L2,劳尔芬奇

2,20100124,C206WR-L2,琼斯戴夫

,,,

1,20100124,C206WR-L4,MAC PETE

3,20100124,C206WR-L4,劳尔芬奇

2,20100124,C206WR-L4,琼斯戴夫

,,,

2,20100124,C206WR-L4,史密斯约翰

1,20100124,C206WR-L4,MAC PETE

,,,

2,20100124,C206WR-L5,布朗克莱尔

3,20100124,C206WR-L5,琼斯戴夫

1,20100124,C206WR-L5,MAC PETE

4

3 回答 3

0

有很多方法可以给这只猫剥皮,我将展示一种更接近我的方法:使用解析器生成器(例如 AXE、Spirit)。由于我对 AXE 非常熟悉,因此这里是您的数据结构的 C++ 语法:

using axe::shortcuts;

// for role you can use a digit, you can additionally contrain it
auto role_rule = _d;
// or you can use char literals instead
// auto role_rule = axe::r_any("123");

// for date you can use digits or axe::r_decimal, depending on what you want to do with it
auto year_rule = axe::r_many(_d, 4);
auto month_rule = _d & _d;
auto date_rule = _d & _d;

// aircraft-liftnumber: as far as I understand it's alpha-numeric
auto aircraft_rule = +_w & '-' & +_w;

// name is two alpha strings separated by spaces
auto first_name_rule = axe::r_alphastr();
auto last_name_rule = axe::r_alphastr();
auto name_rule = last_name_rule & +_ws & first_name_rule;

// a rule to extract all information from the line
std::string line; // read line from file
struct record {
unsigned role, year, month, day;
std::string aircraft, name;
};

record rec;

auto line_rule = role >> rec.role & ','
& year_rule >> rec.year & ','
& month_rule >> rec.month & ','
& day_rule >> rec.day & ','
& aircraft_rule >> rec.aircraft & ','
& name_rule >> rec.name & *_n;

std::vector<record> file_records;

auto file_rule = *(line_rule >> axe::e_ref([&](...)
{
   file_records.push_back(rec);
})) & _z;

// read your file to a vector without filtering
std::ifstream csv_file("filename", std::ios::binary);
std::vector<char> cvs_content(
   std::istreambuf_iterator<char>(cvs_file), 
   std::istreambuf_iterator<char>());

if(!file_rule(cvs_content.begin(), cvs_content.end()).matched())
   throw "file corrupt";
于 2012-05-01T19:52:03.187 回答
0

尝试在插入时使用 std::multimap 对它们进行排序,并且不要丢失任何数据,因为 multimap 可以具有多个相同的键值。(在这种情况下,键值将是角色编号。)因此数据将按照您的需要进行排序。

于 2012-04-30T12:04:16.763 回答
0

您可以使用拆分函数将每个 CSV 行分解为一个vector<string>变量。这是一个示例拆分函数,可以使用 std::string 和 char 分隔符(在您的情况下为“,”)调用:

template<typename T>
static inline std::vector<std::basic_string<T>> split(const std::basic_string<T>& s, T c)
{
    std::vector<std::basic_string<T>> v;

    if (!s.length())
        return v;

    std::basic_string<T>::size_type i = 0, j = s.find(c);

    while (j != std::basic_string<T>::npos)
    {
        v.push_back(s.substr(i, j - i));
        i = ++j;
        j = s.find(c, j);
    }

    v.push_back(s.substr(i, s.length()));

    return v;
}

然后你可以简单地按照你选择的顺序打印出变量。

于 2012-04-30T12:55:41.853 回答