在比较值时解析两个文件

时间:2013-07-30 00:04:44

标签: c++ parsing io iostream ifstream

目前,我的任务是将所有国家/地区所包含的国家/地区添加到mysql表中...

目前,我打算用C ++编写一个解析两个文件的程序,一个包含国家代码和国家名称,另一个文件包含国家代码和国家代码区域。

所以在mysql表中我需要在这样的国家/地区添加国家名称和地区......

因此,国家代码中的一行 - 国家/地区名称文件:

AD  Andorra

来自国家/地区代码 - 区域名称文件的一行:

ad,aixas,Aix‡s,06,,42.4833333,1.4666667

国家/地区代码区域名称文件是巨大的!所以我首先遍历该文件...使用country-code-region名称文件中的每一行我访问另一个文件并将国家代码的前两个字符 - 区域名称文件与国家代码 - 国家/地区名称文件进行比较。我这样做是因为在公司网页中,下拉表应该显示一个国家/地区名称而非缩写。

因此,我继续尝试如何做到这一点......

std::vector<std::string> countryRegionArray;
std::vector<std::string> countryCode;
std::string aline;
std::string bline;
std::ifstream myfile ("/Users/settingj/Documents/Country-State Parse/worldcitiespop.txt"); // country code to region
std::ifstream countryCodes ("/Users/settingj/Documents/Country-State Parse/countries.txt"); //country code to country

while (getline (myfile,aline))
{
    std::string countryCode; // the country code string
    for (int i = 0; i < 2; i++) // loop through the first two characters of the text file to retrieve the Country code
        countryCode.push_back(toupper(aline[i])); // push the characters into a vector and convert them to uppercase to compare later

    while (getline(countryCodes, bline)) // if the file is readable
    {
        std::string country; // declare a string variable to store the comparing country code
        for (int i = 0; i < 2; i++) // loop through the first two characters of the country code text file
            country.push_back(bline[i]); // push the first two characters into the string variable declared in the previous scope

        if (countryCode == country) // if string and country code are equal, change countrycode to the last characters of the string in the country-code ->country text file
        {
            std::string countryName;
            for (int i = 4; i < bline.length(); i++)
                countryName.push_back(bline[i]);
            countryCode = countryName;
        }
        break;
    }

    std::string regionName;
    int count = 0;
    for (int i = 0; i < aline.length(); i++)
    {
        if (aline[i] == ',')
            count++;
        if (count == 2) {
            regionName.push_back(aline[i+1]);
            if (aline[i+2] == ',')
                break;
        }
    }
    countryRegionArray.push_back("Country: " + countryCode + " - Region: " + regionName);
}

现在这个SORTA正常工作,我现在真的不担心效率,因为我正在做的就是创建一个脚本,一旦编写脚本,这个程序可能会被废弃......

这是输出......

Country: Andorra - Region: Aix\340s
Country: AD - Region: Aixirivali
Country: AD - Region: Aixirivall
Country: AD - Region: Aixirvall

正如你所看到的,只有第一行正在被修改......我很难说为什么会发生这种情况......这也不是家庭作业,我公司的网页允许用户注册一个设备,可以从世界上任何国家和地区选择...

如果有人能看到我做错了什么,请给我一些见解:) ...我非常感谢!!!

或者,如果有人可以将我链接到同时包含国家/地区名称和该地区的文件,那就太棒了......我只能找到国家/地区代码 - 区域文件...... :(

1 个答案:

答案 0 :(得分:2)

第一次通过循环读取整个文件:

while (getline(countryCodes, bline)) // if the file is readable

下一次通过它什么都不读,因为你已经在文件的末尾了。这意味着countryCode未更新为countryName并保持设置为代码。

您应该一次读取文件,将数据存储在内存中,然后在内存中复制中搜索国家/地区代码,而不是尝试多次遍历整个文件。考虑合理的数据结构来表示文件中的行。

您还应该查看如何使用std::string::substr()成员函数。