C++讀取時序序列型數(shù)據(jù)(.txt和.csv格式)

1筋帖、介紹

畢業(yè)論文的課題是電力負(fù)荷預(yù)測方向的酗电,格式是每一天的負(fù)荷為一行,一天有96個點典徊。有.txt格式和.csv格式杭煎,因為預(yù)測算法使用C++寫的恩够,所以這里記錄下讀取數(shù)據(jù)的代碼,方便之后要用的時候可以容易找到羡铲。

2蜂桶、ReadData類

2.1 .h文件

#ifndef __READDATA__H_
#define __READDATA__H_

#include <fstream>
#include <string>
#include <vector>
#include <iostream>
#include <regex>
using namespace std;

// 讀取txt(換行符分隔)和csv(逗號分隔)兩種文件格式
class ReadData
{
private:
    enum DataExtensionName
    {
        txt,
        csv
    };
private:
    string m_path;
    string splitchar;
    vector<string> m_OneRowData;       // 一行的數(shù)據(jù)
    vector<vector<double>> m_ReturnData;
    ifstream m_infile;
    DataExtensionName m_dataformat;
private:
    void OpenFile();
    void Preprocessing();
    void Read();
    void GetDataExtensionName();
    void SetSplitChar();
    void WriteResult(string path, vector<vector<string>> outputdata);
public:
    void WriteResult(string path, vector<double> outputdata);
    void SetDataPath(string _path);
    void ConvertDataFormat(string _inputfilepath, string _outputfilepath);
    vector<vector<double>> GetData();
};
#endif

首先是定義一個枚舉量,用來表示可以讀取的文件格式也切。為.txt和.csv格式扑媚。

m_OneRowData是用于暫存一行負(fù)荷數(shù)據(jù)的變量;m_ReturnData則是讀取完所有數(shù)據(jù)之后的矩陣雷恃。

SetSplitChar()函數(shù)是用于設(shè)置數(shù)據(jù)分隔符號疆股,因為txt文件格式用的是'\t',csv文件是用的逗號分隔倒槐。方便后面用正則表達(dá)式分隔旬痹。

Preprocessing()函數(shù)使用正則表達(dá)式分割每一個數(shù)據(jù)并轉(zhuǎn)成double類型存放在矩陣中。

ConvertDataFormat()函數(shù)是將一整列數(shù)據(jù)轉(zhuǎn)換成矩陣的讨越。因為之前有的負(fù)荷數(shù)據(jù)是將每一天的數(shù)據(jù)連在一起并且只用一列存儲两残,看著就難受。

其他函數(shù)看名字就知道含義把跨。就不贅述了人弓。

2.2 .cpp文件

#include "ReadData.h"

void ReadData::SetDataPath(string _path)
{
    m_path = _path;
}


void ReadData::ConvertDataFormat(string _inputfilepath, string _outputfilepath)
{
    // 將一列的負(fù)荷數(shù)據(jù)轉(zhuǎn)換成 n*96的矩陣數(shù)據(jù),輸出到txt文件;
    // 源數(shù)據(jù)是一整列的數(shù)據(jù)
    SetDataPath(_inputfilepath);
    OpenFile();
    Read();

    vector<string> vd;
    vector<vector<string>> outputdata;
    // 轉(zhuǎn)換數(shù)據(jù)格式
    for (size_t i = 0; i < m_OneRowData.size(); i++)
    {
        vd.push_back(m_OneRowData[i]);
        if (vd.size() == 96)
        {
            outputdata.push_back(vd);
            vd.clear();
        }
    }

    if (vd.size() != 0)
        vd.clear();

    // 清空m_OneRowData
    m_OneRowData.clear();

    WriteResult(_outputfilepath, outputdata);
}


void ReadData::OpenFile()
{
    m_infile.open(m_path, ios::in);
    if (!m_infile.is_open())
    {
        printf("open file failed!\n");
        system("pause");
        exit(-1);
    }
    else
    {
        printf("open file successfully.\n");
    }
}


void ReadData::Preprocessing()
{
    regex re(splitchar);
    vector<double> vs;
    for (size_t i = 0; i < m_OneRowData.size(); i++)
    {
        sregex_token_iterator pos(m_OneRowData[i].begin(), m_OneRowData[i].end(), re, -1);
        decltype(pos) end;
        for (; pos != end; ++pos)
        {
            vs.push_back(atof(pos->str().c_str()));
        }
        m_ReturnData.push_back(vs);
        vs.clear();
    }
}


void ReadData::Read()
{
    string line;
    while (getline(m_infile, line))
    {
        m_OneRowData.push_back(line);
    }

    m_infile.close();
}


void ReadData::GetDataExtensionName()
{
    size_t pos = m_path.rfind(".");
    string extension = m_path.substr(pos, m_path.size() - pos);
    if (extension == ".txt")
        m_dataformat = txt;
    else if (extension == ".csv")
        m_dataformat = csv;
    else
    {
        printf("Unsupported file format!.");
        exit(-1);
    }
}


void ReadData::SetSplitChar()
{
    switch (m_dataformat)
    {
    case ReadData::txt: splitchar = "\t";
        break;
    case ReadData::csv: splitchar = ",";
        break;
    default:
        break;
    }
}


void ReadData::WriteResult(string path, vector<vector<string>> outputdata)
{
    // write文本
    ofstream outfile(path, ios::trunc);
    if (!outfile.is_open())
    {
        printf("open output file failed.\n");
        system("pause");
    }
    for (size_t i = 0; i < outputdata.size(); i++)
    {
        for (size_t j = 0; j < outputdata[0].size(); j++)
        {
            outfile << outputdata[i][j] << "\t";
        }
        outfile << "\n";
    }
    outfile.close();
}


void ReadData::WriteResult(string path, vector<double> outputdata)
{
    // write文本
    ofstream outfile(path, ios::trunc);
    if (!outfile.is_open())
    {
        printf("open output file failed.\n");
        system("pause");
    }
    for (size_t i = 0; i < outputdata.size(); i++)
    {
        outfile << outputdata[i] << "\t";
    }
    outfile << "\n";
    outfile.close();
}


vector<vector<double>> ReadData::GetData()
{
    OpenFile();
    GetDataExtensionName();
    SetSplitChar();
    Read();
    Preprocessing();
    return m_ReturnData;
}

cpp文件中的函數(shù)實現(xiàn)也是比較簡單着逐,用的是簡單的正則表達(dá)式切分?jǐn)?shù)據(jù)并轉(zhuǎn)化為double數(shù)據(jù)票从,用于后續(xù)的算法對電力負(fù)荷進(jìn)行預(yù)測。

使用的時候直接調(diào)用ReadData::GetData()函數(shù)就可以返回數(shù)據(jù)矩陣滨嘱。行數(shù)為天數(shù)峰鄙,列數(shù)為96,因為使用的電力負(fù)荷數(shù)據(jù)是96點的太雨。

ReadData::GetData()函數(shù)的流程是打開文件-->獲取文件擴(kuò)展名-->由擴(kuò)展名確定分割符-->讀取數(shù)據(jù)-->將文本轉(zhuǎn)化為double矩陣-->返回矩陣吟榴。當(dāng)然在調(diào)用ReadData::GetData()之前要設(shè)置文件路徑SetDataPath()。而WriteResult是將數(shù)據(jù)寫到txt文件中囊扳。需要輸出的就調(diào)用吩翻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锥咸,隨后出現(xiàn)的幾起案子狭瞎,更是在濱河造成了極大的恐慌,老刑警劉巖搏予,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熊锭,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)碗殷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門精绎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锌妻,你說我怎么就攤上這事代乃。” “怎么了仿粹?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵搁吓,是天一觀的道長。 經(jīng)常有香客問我吭历,道長堕仔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任毒涧,我火速辦了婚禮贮预,結(jié)果婚禮上贝室,老公的妹妹穿的比我還像新娘契讲。我一直安慰自己,他們只是感情好滑频,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布捡偏。 她就那樣靜靜地躺著,像睡著了一般峡迷。 火紅的嫁衣襯著肌膚如雪银伟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天绘搞,我揣著相機(jī)與錄音彤避,去河邊找鬼。 笑死夯辖,一個胖子當(dāng)著我的面吹牛琉预,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒿褂,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼圆米,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啄栓?” 一聲冷哼從身側(cè)響起娄帖,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昙楚,沒想到半個月后近速,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年数焊,在試婚紗的時候發(fā)現(xiàn)自己被綠了永淌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡佩耳,死狀恐怖遂蛀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情干厚,我是刑警寧澤李滴,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蛮瞄,受9級特大地震影響所坯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挂捅,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一芹助、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闲先,春花似錦状土、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至训桶,卻和暖如春累驮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舵揭。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工谤专, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人午绳。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓置侍,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箱叁。 傳聞我的和親對象是個殘疾皇子墅垮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容