2012-04-30 2 views
1

Получил этот файл csv моего журнала перехода и хотел бы отсортировать его в каждом блоке (запись перехода), чтобы сначала был введен интроструктор, второй и дополнительный оператор-студент. Текущие они написаны в различном порядке.Анализ и сортировка csv-файла по строке

Думал о чтении и назначении каждой строки блока в vars, а затем печатании с использованием пустой строки в качестве контурного цикла. Я на правильном пути? Предпочитаете помощь по решению на C++ (небольшая часть опыта и настройка компилятора), но я с нетерпением ждал, чтобы это лето появилось в орехах и болтах любого рекомендованного языка. Возможный Python или любой, у которого есть хорошая книга для CompSci.

Любые советы & отзыв очень оценен!

первый col - роль: 1,2,3.

роль (1,2,3), дата (yyymmdd), самолет-liftnumber, имя роль 1 является инструктором тандем, роль 2 студент, роль 3 свободного падения камеры (опционально)

1,20100124, C206WR-L1, MAC ПИТ

2,20100124, C206WR-L1, ГОВАРД Стеф

3,20100124, C206WR-L1, JONES DAVE

,,,

2,20100124, C206WR-L3, Оллсоп BEX

1,20100124, C206WR-L3, MAC-ПИТЬ

3,20100124, C206WR-L3, ДЖОНС ДЭЙВ

,,,

1,20100124, C206WR-L2, MAC ПИТ

3,20100124, C206WR-L2, LAUER FINCH

2,20100124, C206WR-L2, JONES DAVE

,,,

1,20100124, C206WR-L4, MAC ПИТ

3,20100124, C206WR-L4, LAUER FINCH

2,20100124, C206WR-L4, JONES DAVE

,,,

2,20100124, C206WR-L4, Джон Смит

1,20100124, C206WR- L4, MAC ПИТ

,,,

2,20100124, C206WR-L5, BROWN CLAIRE

3,20100124, C206WR-L5, JONES DAVE

1,20100124, C206WR-L5 , MAC PETE

ответ

0

Попробуйте использовать std :: multimap, чтобы отсортировать их при вставке, а также не потерять данные, так как multimap может иметь несколько одинаковых значений ключа. (В этом случае значениями ключей будут номера ролей.) Поэтому данные будут отсортированы по вашему желанию.

+0

Если я не понял, что ОП хочет разобраться в каждой строке, не сортировать все строки в карте. – Benj

+0

Итак, для каждого блока данных ему нужно использовать std :: map (поскольку повторение значения ключа не произойдет), и каждый блок сортируется. – phantasmagoria

0

Вы можете использовать функцию split для разбивки каждой строки CSV на переменные vector<string>. Вот разделить функции пример, который можно назвать с станд :: строки и полукокса разделители (в вашем случае будет «»):

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; 
} 

Тогда можно просто распечатать переменные в порядке выберите.

0

Есть много способов обмануть этого кота, я покажу один, который ближе ко мне: используйте генератор парсера (например, AX, Spirit).Так как я тесно знаком с АХ, вот грамматика 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"; 
Смежные вопросы