使用令牌仅解析csv文件中的特定列

trueCamelType

如果我有一个用逗号分隔的值填充的文件,例如:

"myComputer",5,192.168.1.0,25
"herComputer",6,192.168.1.1,26
"hisComputer",7,192.168.1.2,27

而且我想将数据作为字符串提取,我会做这样的事情:

std::string line;
std::ifstream myfile ("myCSVFile.txt");

if(myfile.is_open())
{
    while(getline(myfile,line))
    {
        std::string tempString = line;
        std::string delimiter = ",";
    }
}

为了自己解析每个值,我使用类似以下的方法:使用字符串定界符(标准C ++)在C ++中解析(拆分)一个字符串

std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";

size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
    token = s.substr(0, pos);
    std::cout << token << std::endl;
    s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;

问题是,如果我只想要第一个和第三个值,该怎么办?因此,如果我想从上方将我的csv文件设为仅输出

"myComputer" 192.168.1.0
"herComputer" 192.168.1.1
"hisComputer" 192.168.1.2

是否可以使用上述方法来实现此目的,还是应该使用完全不同的方法?谢谢,

克里斯蒂安·哈克(Christian Hackl)

使用专用库来完成此任务要容易得多。使用Boost Tokenizer的转义列表分隔符,轻而易举:

#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <boost/tokenizer.hpp>

int main()
{
    std::ifstream myfile("myCSVFile.txt");

    if (myfile.is_open())
    {
        std::string line;
        while (std::getline(myfile, line))
        {
            typedef boost::escaped_list_separator<char> Separator;
            typedef boost::tokenizer<Separator> Tokenizer;

            std::vector<std::string> tokens;
            Tokenizer tokenizer(line);
            for (Tokenizer::iterator iter = tokenizer.begin(); iter != tokenizer.end(); ++iter)
            {
               tokens.push_back(*iter);
            }

            if (tokens.size() == 4)
            {
                std::cout << tokens[0] << "\t" << tokens[2] << "\n";
            }
            else
            {
                std::cerr << "illegal line\n";
            }
        }
    }
}

请注意,在C ++ 11中,您可以简化循环:

for (auto &token : tokenizer)
{
    tokens.push_back(token);
}          

如您所见,其想法是将一行的所有值存储在a中std::vector,然后输出所需的内容。

现在,如果您真正处理大文件,可能会导致性能问题。在这种情况下,将计数器与令牌生成器一起使用:

#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <boost/tokenizer.hpp>

int main()
{
    std::ifstream myfile("myCSVFile.txt");

    if (myfile.is_open())
    {
        std::string line;
        while (std::getline(myfile, line))
        {
            typedef boost::escaped_list_separator<char> Separator;
            typedef boost::tokenizer<Separator> Tokenizer;

            Tokenizer tokenizer(line);
            int count = 0;
            for (Tokenizer::iterator iter = tokenizer.begin(); (iter != tokenizer.end()) && (count < 3); ++iter)
            {
                if ((count == 0) || (count == 2))
                {
                    std::cout << *iter;
                    if (count == 0)
                    {
                        std::cout << "\t";
                    }
                }
                ++count;
            }
            std::cout << "\n";
        }
    }
}

甚至可以使用自己制作的字符串拆分算法,也可以使用这两种技术(std::vector<std::string>稍后输出带计数器循环)。基本思想是相同的:

std::vector<std::string>

std::vector<std::string> tokens;
while ((pos = s.find(delimiter)) != std::string::npos) {
    token = s.substr(0, pos);
    tokens.push_back(token);
    s.erase(0, pos + delimiter.length());
}

if (tokens.size() == 4)
{
    std::cout << tokens[0] << "\t" << tokens[2] << "\n";
}
else
{
    std::cerr << "illegal line\n";
}

带柜台:

int count = 0;
while ((pos = s.find(delimiter)) != std::string::npos && (count < 4)) {
    token = s.substr(0, pos);

    if ((count == 0) || (count == 2))
    {
        std::cout << token;
        if (count == 0)
        {
            std::cout << "\t";
        }
    }
    ++count;
    s.erase(0, pos + delimiter.length());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Python 3.5从CSV文件中的仅两列中删除特定字符

来自分类Dev

使用令牌解析文件

来自分类Dev

在python中解析CSV的特定列

来自分类Dev

使用Python在CSV文件中获取特定列

来自分类Dev

使用javascript访问csv文件中的特定列

来自分类Dev

在python中使用numpy读取csv文件中的特定列

来自分类Dev

仅使用python将csv文件中的特定行插入Sqlite3数据库

来自分类Dev

如何使用python从csv文件中仅读取特定范围的行?

来自分类Dev

如何使用PapaParse从文件中解析CSV?

来自分类Dev

熊猫:从CSV文件中获取特定的列

来自分类Dev

在csv文件的特定列中插入数据

来自分类Dev

从 csv 文件中读取并保存特定列

来自分类Dev

仅选择CSV的特定列

来自分类Dev

使用批处理脚本仅读取分隔文件中的特定列

来自分类Dev

VBA仅复制excel中的特定列以导出为csv

来自分类Dev

解析CSV以获取特定列

来自分类Dev

如果我要解析的列在 Python 中的 CSV 文件的中间,如何解析 CSV 文件?

来自分类Dev

在R中,能否仅获取csv(txt)文件的名称列?

来自分类Dev

使用python将CSV文件中特定列中的'/'替换为'_'

来自分类Dev

使用vb.net中的特定列和行将csv文件导入到datagridview中

来自分类Dev

如何仅替换文件中的特定列?

来自分类Dev

仅计算文件特定列中的字母数字单词

来自分类Dev

如何仅复制和粘贴每个文件中的特定列?

来自分类Dev

使用python读取csv中的特定列

来自分类Dev

Java:如何解析 csv 文件以比较列中的数据

来自分类Dev

将CSV文件解析为列(最好使用python)

来自分类Dev

使用PHP将数据添加到特定列的CSV文件中

来自分类Dev

如何使用Pandas处理.csv文件中的数据并访问特定的行和列?

来自分类Dev

如何使用csv文件计算python中的列总和(但取特定行)?

Related 相关文章

  1. 1

    使用Python 3.5从CSV文件中的仅两列中删除特定字符

  2. 2

    使用令牌解析文件

  3. 3

    在python中解析CSV的特定列

  4. 4

    使用Python在CSV文件中获取特定列

  5. 5

    使用javascript访问csv文件中的特定列

  6. 6

    在python中使用numpy读取csv文件中的特定列

  7. 7

    仅使用python将csv文件中的特定行插入Sqlite3数据库

  8. 8

    如何使用python从csv文件中仅读取特定范围的行?

  9. 9

    如何使用PapaParse从文件中解析CSV?

  10. 10

    熊猫:从CSV文件中获取特定的列

  11. 11

    在csv文件的特定列中插入数据

  12. 12

    从 csv 文件中读取并保存特定列

  13. 13

    仅选择CSV的特定列

  14. 14

    使用批处理脚本仅读取分隔文件中的特定列

  15. 15

    VBA仅复制excel中的特定列以导出为csv

  16. 16

    解析CSV以获取特定列

  17. 17

    如果我要解析的列在 Python 中的 CSV 文件的中间,如何解析 CSV 文件?

  18. 18

    在R中,能否仅获取csv(txt)文件的名称列?

  19. 19

    使用python将CSV文件中特定列中的'/'替换为'_'

  20. 20

    使用vb.net中的特定列和行将csv文件导入到datagridview中

  21. 21

    如何仅替换文件中的特定列?

  22. 22

    仅计算文件特定列中的字母数字单词

  23. 23

    如何仅复制和粘贴每个文件中的特定列?

  24. 24

    使用python读取csv中的特定列

  25. 25

    Java:如何解析 csv 文件以比较列中的数据

  26. 26

    将CSV文件解析为列(最好使用python)

  27. 27

    使用PHP将数据添加到特定列的CSV文件中

  28. 28

    如何使用Pandas处理.csv文件中的数据并访问特定的行和列?

  29. 29

    如何使用csv文件计算python中的列总和(但取特定行)?

热门标签

归档