读取在某些行上带有前导制表符的制表符分隔文本文件
Reading a tab delimited text file with leading tabs on some lines
我正在构建一个基于控制台的电子表格应用程序,它将 UTF-8 编码的文本文件作为输入并将结果输出到控制台。
列值由制表符分隔,每一行都是一个新行。我在阅读以制表符分隔的输入文本文件时遇到一些问题,其中一些行(行)以制表符开头,表明第一列中没有值。我只想提取“填充”单元格并在程序的其他地方使用数据并丢弃或忽略“空”单元格。在 getline()
函数中使用 '\t' 分隔符似乎并没有忽略这些前导制表符。提前感谢您提供任何帮助或代码建议。
示例输入:
1 \t 2
\t 3
\t \t =A1+B1+B2
我一直在使用的简单代码如下:
#include <iostream>
#include <stream>
#include <string>
// Variable declarations
std::ifstream sheetFile;
std::string input;
int main(int argc, char *argv[])
{
sheetFile.open(argv[1]);
while (getline(sheetFile, input, '\t'))
{
std::cout << input << std::endl;
}
sheetFile.close();
return 0;
}
控制台的 return 是:
1
2
3
=A1+B1+B2
您可以使用多个 std::getline()
调用 - 一个在循环中读取由 \n
分隔的每一行,然后将每一行放入 std::istringstream
并使用 std::getline()
在 thaat 流上解析在 \t
上分隔的每一列,例如:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
int main(int argc, char *argv[])
{
// Variable declarations
std::ifstream sheetFile(argv[1]);
std::string line, input;
while (std::getline(sheetFile, line))
{
std::istringstream iss(line);
while (std::getline(iss, input, '\t'))
{
if (!input.empty())
std::cout << input << std::endl;
}
}
return 0;
}
或者,使用单个 std::getline()
,您可以使用 std::ws
流操纵器忽略每行的前导空格,这将包括 \t
和 \n
字符:
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
int main(int argc, char *argv[])
{
// Variable declarations
std::ifstream sheetFile(argv[1]);
std::string input;
while (std::getline(sheetFile >> std::ws, input, '\t'))
{
std::cout << input << std::endl;
}
return 0;
}
我正在构建一个基于控制台的电子表格应用程序,它将 UTF-8 编码的文本文件作为输入并将结果输出到控制台。
列值由制表符分隔,每一行都是一个新行。我在阅读以制表符分隔的输入文本文件时遇到一些问题,其中一些行(行)以制表符开头,表明第一列中没有值。我只想提取“填充”单元格并在程序的其他地方使用数据并丢弃或忽略“空”单元格。在 getline()
函数中使用 '\t' 分隔符似乎并没有忽略这些前导制表符。提前感谢您提供任何帮助或代码建议。
示例输入:
1 \t 2
\t 3
\t \t =A1+B1+B2
我一直在使用的简单代码如下:
#include <iostream>
#include <stream>
#include <string>
// Variable declarations
std::ifstream sheetFile;
std::string input;
int main(int argc, char *argv[])
{
sheetFile.open(argv[1]);
while (getline(sheetFile, input, '\t'))
{
std::cout << input << std::endl;
}
sheetFile.close();
return 0;
}
控制台的 return 是:
1
2
3
=A1+B1+B2
您可以使用多个 std::getline()
调用 - 一个在循环中读取由 \n
分隔的每一行,然后将每一行放入 std::istringstream
并使用 std::getline()
在 thaat 流上解析在 \t
上分隔的每一列,例如:
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
int main(int argc, char *argv[])
{
// Variable declarations
std::ifstream sheetFile(argv[1]);
std::string line, input;
while (std::getline(sheetFile, line))
{
std::istringstream iss(line);
while (std::getline(iss, input, '\t'))
{
if (!input.empty())
std::cout << input << std::endl;
}
}
return 0;
}
或者,使用单个 std::getline()
,您可以使用 std::ws
流操纵器忽略每行的前导空格,这将包括 \t
和 \n
字符:
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
int main(int argc, char *argv[])
{
// Variable declarations
std::ifstream sheetFile(argv[1]);
std::string input;
while (std::getline(sheetFile >> std::ws, input, '\t'))
{
std::cout << input << std::endl;
}
return 0;
}