繁体   English   中英

使用空格数据读取以空格分隔的数据

[英]Reading space-separated data with spaces data

我正在从文本文件中读取行,其中的数据以类似以下的空格分隔成列:

UNITED STATES OF AMERICA           WASHINGTON          9629047   291289535
CHINA                              PEKING              9596960   1273111290

我以前使用以下代码处理过类似的数据:

ifstream readThis("somefile.txt", ios::in);
while (readThis >> country >> capital >> area >> population) {
    // some code...
}

当数据没有空格(例如“美国”)时,此方法效果很好。 现在发生的事情是,一旦遇到空格,数据就会保存到下一个变量(即“ 2UNITED”将进入country ,“ STATES”将进入capital ,依此类推)。 我要做的是感觉很乱,所以我希望它们是处理数据的更好方法。 这是我现在想做的:

  • std::getline阅读整行。
  • 逐个字符地浏览行。
  • 将字符存储在适当的变量中,直到我们连续读取2个空格为止。
  • 在这一点上,请忽略任何空格并读取直到我们找到一个字符为止。

这种方法看起来更像是K&R的练习,并且可能不是C ++的方法。 我应该提到数据全部正确对齐(“列”的宽度都相同)。 我在想必须要有一种方法来正确读取“对齐的”数据(基本上是cout << setw(20) << "Hello" << ...

任何想法都欢迎。 谢谢!

我建议一个更好的方法是:
1.使用std::getline阅读整行。
2.使用std::substr和字段宽度提取字段。
3.根据需要修剪字段字符串。
4.处理字段。 5.在步骤1重复,直到读取失败。

如果我知道一个正则表达式, 是一个明显的例子( 住在这里 ):

#include <iostream>
#include <sstream>
#include <boost/regex.hpp>

int main() {
    std::istringstream i { "UNITED STATES OF AMERICA  WASHINGTON, DC  2233232  23232323\nPOPULAR REPUBLIC OF CHINA  BEIJING  23232323  23232323\nBRAZIL  BRASILIA  232323233  2323323\n" };
    boost::regex r { R"(^(.*?)\s\s+(.*?)\s\s+(\d+)\s\s+(\d+))", boost::regex::perl };
    std::string line;
    while( std::getline(i, line) ) {
        boost::smatch m;
        if( !boost::regex_match(line, m, r) )
            continue;
        auto country = m[1].str();
        auto capital = m[2].str();
        auto area = m[3].str();
        auto pop = m[3].str();
        std::cout << capital << ", " << country << ";\n";
    }
}

注意

#include <regex>

并且只有在使用libc++ ,才可以使用std::regexstd::smatchstd::regex_match ,但GNU libstdc++ (最高4.8)无法正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM