2017-01-03 50 views
0

我想知道给出标题时的列号。如何获取C++中的列号?

例如为S Mac Bonded State SIS Qos(DS-US) CPE MAC address IP Address

列1是S,2是Mac,3是Bonded,4是State,5是SIS,6是Qos(DS-US),7是CPE,8是MAC address和9是IP Address

问题是,如果拆分基于空间" ",MAC和地址将被视为不同的列,这是不正确的。

文件的头三行我解析

S/C/CH-S/CG/CH Mac Bonded State  SIS Qos(DS-US) CPE MAC address  IP Address 
12/0/18-1/0/0  1  4x4 Operational 3.0 120M/12M  0 000f.c22a.7014 10.135.148.24 
12/0/0-1/0/4  1  4x4 Operational 3.0 120M/12M  0 1121.10fc.3993 10.135.148.50 
12/0/8-1/0/0  1  4x4 Operational 3.0 120M/12M  0 1121.81fc.1234 10.135.148.43 

的列始终在同一位置对齐,所以这可能是一个解决办法,但我不知道怎么去的位置。

什么是解决问题的最佳方法?

+4

莫不是你看不到字段之间标签? –

+0

你能发布你想分析的第一个3-4行文件吗?并且请将其发布到http://pastebin.com/,以便我们可以逐字查看该文件。 –

+0

不,没有标签栏。 – user2314946

回答

0

您可以使用另一个分隔符来分隔列。例如代替空格(" "),可以使用逗号(",")或连字符("-")。我建议使用可能不会用在文件其他地方的东西来避免任何错误。

+0

我不能更改数据,我只能解析它 – user2314946

+0

也许你可以使用一些if语句和temp变量来检查某些标题,假设你事先知道标题将会是什么。比方说,如果第一个temp输入变量给你'MAC',并且下一个temp输入变量给你'Address',那么你将它们分组成一列。这不是一个优雅的修复,但它可以工作。 – Sphics

+0

但是这不会工作,如果我需要知道IP地址的列号,因为它将计数2列的MAC地址。 只有当我知道所有标题之前,这才有效。 – user2314946

0

使用boost::algorithm::split_regex

std::vector<std::string> result; 
std::string str = "S Mac Bonded State  SIS Qos(DS-US) CPE MAC address" 
boost::algorithm::split_regex(result, str, regex(" ")) ; 

如果你想接受多个空格作为分隔符,只需使用正则表达式"\s{2,}"

+0

我不能使用2个空格,因为某些列仅由单个空格分隔 – user2314946

+1

在这种情况下,无法区分单个空格是列分隔符还是列名的一部分。考虑改变分隔符,如其他建议。 – pSoLT

0

你应该做的基于列的位置分割。

的第一项开始于第1列,并在塔18结束时,第二项开始于柱19及在柱25等结束

做一分为两个阶段:

第1阶段:

分割线基于列的位置,这将给你:

  • "12/0/18-1/0/0 "
  • "1 "
  • "4x4 "
  • "Operational "
  • "3.0 "
  • "120M/12M "
  • "0 "
  • "000f.c22a.7014"
  • "10.135.148.24"

阶段2:

地带TRA iling空间,这将导致:

  • "12/0/18-1/0/0"
  • "1"
  • "4x4"
+0

如何导出职位? – user2314946

+0

@ user2314946这个职位是固定的。阅读我答案的第二段:_第一项从第一栏开始,到第18栏结束,第二项从第19栏开始,到第25栏结束。 –