天道酬勤,学无止境

C# - How to parse text file (space delimited numbers)?

Given a data file delimited by space,

10 10 10 10 222 331 
2 3 3 4 45
4 2 2 4

How to read this file and load into an Array

Thank you

评论

var fileContent = File.ReadAllText(fileName);
var array = fileContent.Split((string[])null, StringSplitOptions.RemoveEmptyEntries);

if you have numbers only and need a list of int as a result, you can do this:

var numbers = array.Select(arg => int.Parse(arg)).ToList();

It depends on the kind of array you want. If you want to flatten everything into a single-dimensional array, go with Alex Aza's answer, otherwise, if you want a 2-dimensional array that maps to the lines and elements within the text file:

var array = File.ReadAllLines(filename)
                .Select(line => line.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
                .Where(line => !string.IsNullOrWhiteSpace(line)) // Use this to filter blank lines.
                .Select(int.Parse) // Assuming you want an int array.
                .ToArray();

Be aware that there is no error handling, so if parsing fails, the above code will throw an exception.

I couldn't get Quick Joe Smith's answer to work, so I modified it. I put the modified code into a static method within a "FileReader" class:

public static double[][] readWhitespaceDelimitedDoubles(string[] input)
{
    double[][] array = input.Where(line => !String.IsNullOrWhiteSpace(line)) // Use this to filter blank lines.
        .Select(line => line.Split((string[])null, StringSplitOptions.RemoveEmptyEntries))
        .Select(line => line.Select(element => double.Parse(element)))
        .Select(line => line.ToArray())
        .ToArray();

        return array;
}

For my application, I was parsing for double as opposed to int. To call the code, try using something like this:

string[] fileContents = System.IO.File.ReadAllLines(openFileDialog1.FileName);
double[][] fileContentsArray = FileReader.readWhitespaceDelimitedDoubles(fileContents);

Console.WriteLine("Number of Rows:      {0,3}", fileContentsArray.Length);
Console.WriteLine("Number of Cols:      {0,3}", fileContentsArray[0].Length);

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 我如何正确解析由空格分隔的文本文件(how can i correctly parse a text file delimited by white space)
    问题 以下是我的示例文本文件 { 这是我的架构文件 [Sample File.txt] ColNameHeader=True Format=TabDelimited CharacterSet=ANSI 这是我到目前为止为尝试读取上述示例文件而编写的代码,应该将从上面的文本文件读取的数据行返回以显示在dataGridView控件中。 问题是,它作为单列返回,但是我想使用那些空白作为列定界符。 我尝试了不同的字符分隔符,但均未成功。 public DataSet LoadCSV(int numberOfRows) { DataSet ds = new DataSet(); // Creates and opens an ODBC connection string strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + this.dirCSV.Trim() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False"; string sql_select; OdbcConnection conn; conn = new OdbcConnection(strConnString.Trim()); conn.Open(); //Creates
  • 将文本文件解析为 CSV C#(Parsing a Text file to CSV C#)
    问题 我是 C# 开发的新手。 我需要解析一个巨大的文本文件,每行包含几行数据。 输出将是一个 CSV 文件。 该文件的格式遵循以下模式: Acronym: TIFFE Name of proposal: Thermal Systems Integration for Fuel Economy Contract number: 233826 Instrument: CP – FP # Acronym: STREAMLINE Name of proposal: Strategic Research For Innovative Marine Propulsion Concepts Contract number: 233896 Instrument: CP – FP 其中#代表新记录。 现在这个文本文件中有数百个“记录”。 我希望能够将所有内容解析为 CSV,其中包含首字母缩略词、提案名称等列以及包含每条记录实际数据的行。 有没有最好的方法来尝试这个? 我猜在将数据解析为 CSV 之前,我必须将数据解析为中间体(如 DataTable)。 回答1 这个简单的 LINQ 语句将您的输入文件解析为一系列记录,并将每条记录以 CSV 格式写入输出文件(假设每条记录中字段的数量和顺序相同): File.WriteAllLines("output.csv", File .ReadLines(
  • 在Pandas中解析csv文件时,如何从字符串中删除多余的空格?(How can I remove extra whitespace from strings when parsing a csv file in Pandas?)
    问题 我有以下名为“ data.csv”的文件: 1997,Ford,E350 1997, Ford , E350 1997,Ford,E350,"Super, luxurious truck" 1997,Ford,E350,"Super ""luxurious"" truck" 1997,Ford,E350," Super luxurious truck " "1997",Ford,E350 1997,Ford,E350 2000,Mercury,Cougar 我想将其解析为pandas DataFrame,以便DataFrame如下所示: Year Make Model Description 0 1997 Ford E350 None 1 1997 Ford E350 None 2 1997 Ford E350 Super, luxurious truck 3 1997 Ford E350 Super "luxurious" truck 4 1997 Ford E350 Super luxurious truck 5 1997 Ford E350 None 6 1997 Ford E350 None 7 2000 Mercury Cougar None 我能做的最好的事情是: pd.read_table("data.csv", sep=r',', names=["Year"
  • C# 读取包含由制表符分隔的数据的文本文件(C# Read Text File Containing Data Delimited By Tabs)
    问题 我有一些代码: public static void ReadTextFile() { string line; // Read the file and display it line by line. using (StreamReader file = new StreamReader(@"C:\Documents and Settings\Administrator\Desktop\snpprivatesellerlist.txt")) { while ((line = file.ReadLine()) != null) { char[] delimiters = new char[] { '\t' }; string[] parts = line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < parts.Length; i++) { Console.WriteLine(parts[i]); sepList.Add(parts[i]); } } file.Close(); } // Suspend the screen. Console.ReadLine(); } 它读入包含由制表符分隔的数据的文本文件,并将数据拆分为单独的单词。 我遇到的问题是
  • 在 C# 中用单独的列创建一个带分隔符的文本(create a delimited text in c# with separate columns)
    问题 我一直在尝试在 c# 中创建一个制表符限制的文本文件,以便数据正确显示在单独的列中。 Firstname Lastname Age John Smith 17 James Sawyer 31 我试过“\t”字符,但我得到的只是这个: Firstname Lastname Age John Smith 17 James Sawyer 31 这是我的代码: string[,] P = new string[2, 3] { { "John", "Smith", "17" }, { "James", "Sawyer", "31" } }; using (StreamWriter s_w = new StreamWriter(target)) { s_w.WriteLine("Firstname \t Lastname \t Age"); for (int i = 0; i < 2; i++) { s_w.WriteLine("{0} \t {1} \t {2}", P[i,0], P[i,1], P[i,2]); } } 回答1 您可以像这样使用 PadRight: s_w.WriteLine("{0} \t {1} \t {2}", P[i, 0].PadRight(10, ' '), P[i, 1].PadRight(10, ' '), P[i, 2].PadRight(10,
  • C# 是否具有解析页码字符串的内置支持?(Does C# have built-in support for parsing page-number strings?)
    问题 C# 是否内置支持解析页码字符串? 通过页码,我的意思是您可能输入到打印对话框中的格式,它是逗号和破折号分隔的混合格式。 像这样的东西: 1,3,5-10,12 真正好的解决方案是让我返回某种由字符串表示的所有页码的列表。 在上面的例子中,像这样返回一个列表会很好: 1,3,5,6,7,8,9,10,12 如果有一种简单的方法,我只想避免自己滚动。 回答1 应该很简单: foreach( string s in "1,3,5-10,12".Split(',') ) { // try and get the number int num; if( int.TryParse( s, out num ) ) { yield return num; continue; // skip the rest } // otherwise we might have a range // split on the range delimiter string[] subs = s.Split('-'); int start, end; // now see if we can parse a start and end if( subs.Length > 1 && int.TryParse(subs[0], out start) && int.TryParse(subs[1], out
  • 在 Perl 中,如何正确解析带引号的字符串的制表符/空格分隔文件?(In Perl, how can I correctly parse tab/space delimited files with quoted strings?)
    问题 我需要解析在 Perl 中有很多列的制表符/空格分隔文件。 值是这样的,有双引号括起来的大字符串。 这些字符串可以包含任何字符,例如制表符和空格或其他任何字符。 当我尝试使用 split 函数解析它们时,它也会拆分这些字符串。 现在如何让 perl 理解“”中的字符串是单列条目? 一个简单的例子是, 12 345546.67677 "Hello World!!!" -567.55656 0.5465767 "Hello_Again; " 回答1 使用 Text::CSV 库,它为您处理所有边缘情况。 它允许您设置分隔符: my $csv = Text::CSV->new({sep_char => "\t"}); 回答2 请注意,您说的是tab/space delimited 。 如果混合分隔符和/或您必须将连续空格视为一个,则使用 Text::ParseWords 可能更容易: #!/usr/bin/perl use Text::ParseWords qw( quotewords ); use YAML; while ( my $line = <DATA> ) { print Dump [ quotewords('\s+', 0, $line) ]; } __DATA__ 12 345546.67677 "Hello World!!!" -567.55656 0
  • 解析文本文件的行,其中值由不同数量的空白字符分隔(Parse lines of a text file where values are separated by a varying number of whitespace characters)
    问题 我需要在不同的数组中获取公司名称及其股票代码。 这是我存储在txt文件中的数据: 3M Company MMM 99 Cents Only Stores NDN AO Smith Corporation AOS Aaron's, Inc. AAN 等等 我将如何使用正则表达式或其他一些技术来做到这一点? 回答1 迭代每一行,并使用正则表达式收集数据: ^(.+?)\s+([A-Z]+)$ 反向引用$1将包含公司名称, $2将包含股票代码。 您还可以使用两个或三个空格分隔符将字符串分成两部分,然后修剪生成的两个字符串。 这仅在您确定公司名称和股票代码始终由足够的空格分隔并且公司名称本身不包含那么多空格时才有效。 回答2 文本文件的格式是强加给你的吗? 如果您有选择,我建议您不要使用空格来分隔文本文件中的字段。 相反,使用 | 或 $$ 或您可以保证不会出现在内容中的内容,然后将其拆分为数组。 回答3 试试这个正则表达式: (.+)\s*([A-Z]{3})$ 也许有更多 PHP 经验的人可以使用 preg_split 或类似的东西充实代码示例。 回答4 使用可变空格作为两列文本之间的分隔符,有几种方法可以做到这一点。 您可以使用file()逐行处理文本文件,并使用preg_split()将变量空间上的文本分开,后跟一系列大写字母,然后是字符串的结尾,或者您可以使用file
  • 如何使“ cut”命令将顺序分隔符视为相同?(How to make the 'cut' command treat same sequental delimiters as one?)
    问题 我正在尝试从基于列的“空间”调整后的文本流中提取某个(第四个)字段。 我正在尝试通过以下方式使用cut命令: cat text.txt | cut -d " " -f 4 不幸的是, cut并没有将多个空格视为一个定界符。 我本来可以通过awk awk '{ printf $4; }' 或sed sed -E "s/[[:space:]]+/ /g" 折叠空间,但是我想知道是否有任何方式可以原生处理cut和几个定界符? 回答1 尝试: tr -s ' ' <text.txt | cut -d ' ' -f4 在tr手册页中: -s, --squeeze-repeats replace each input sequence of a repeated character that is listed in SET1 with a single occurrence of that character 回答2 在您对问题进行评论时, awk确实是必经之路。 如kev的答案所示,可以将cut与tr -s一起使用来压缩空间。 但是,让我为将来的读者介绍所有可能的组合。 解释在“测试”部分。 tr | 切 tr -s ' ' < file | cut -d' ' -f4 awk awk '{print $4}' file 重击 while read -r _ _ _ myfield
  • how can i correctly parse a text file delimited by white space
    Below is my sample text file { Here is my schema file [Sample File.txt] ColNameHeader=True Format=TabDelimited CharacterSet=ANSI And here is the code i have so far writen to try and read the above sample file, the data rows read from the text file above is supposed to be returned for display in a dataGridView control. The problem is, its being returned as single column, yet i want to use those white spaces as the column delimiters. I have tried different character delimiters with out success. public DataSet LoadCSV(int numberOfRows) { DataSet ds = new DataSet(); // Creates and opens an ODBC
  • 解析具有多个公共分隔符的文件 C(Parse a file with multiple common delimiters C)
    问题 我正在使用 C 语言开发一个基本的命令行音乐库,它允许您通过命令行打开文件,并添加艺术家、歌曲名称和出版年份等信息。 一旦它退出,它就会将该信息写回到同一个文件中。 我遇到的问题是试图找到正确解析文本文件的解决方案。 例如,输入文件将如下所示: Title: Heirloom, Artist: Basenji, Year Published: 2014 Title: With Me, Artist: Cashmere Cat, Year Published: 2014 我正在从事的项目指定(违反惯例)我们将一行信息存储在如下所示的struct Song中: struct Song { char title[250]; char artist[250]; int year_published; }; 每个Song都存储在struct Song类型的数组中,称为music_lib[] 。 我知道如何通过执行以下操作将每一行分成一个特定的struct Song : while(fscanf(input_file, "%s %s %ld", *temp_title, *temp_artist, *temp_year) != EOF) copy_song_to_music_library(temp_title, temp_artist, temp_year)
  • C# Read Text File Containing Data Delimited By Tabs
    I have some code: public static void ReadTextFile() { string line; // Read the file and display it line by line. using (StreamReader file = new StreamReader(@"C:\Documents and Settings\Administrator\Desktop\snpprivatesellerlist.txt")) { while ((line = file.ReadLine()) != null) { char[] delimiters = new char[] { '\t' }; string[] parts = line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < parts.Length; i++) { Console.WriteLine(parts[i]); sepList.Add(parts[i]); } } file.Close(); } // Suspend the screen. Console.ReadLine(); } It reads in a text file that contains
  • .NET可以加载和解析与Java Properties类等效的属性文件吗?(Can .NET load and parse a properties file equivalent to Java Properties class?)
    问题 C#中有没有一种简单的方法来读取属性文件,该属性文件的每个属性都位于单独的行上,后跟等号和值,例如: ServerName=prod-srv1 Port=8888 CustomProperty=Any value 在Java中,Properties类可轻松处理此解析: Properties myProperties=new Properties(); FileInputStream fis = new FileInputStream (new File("CustomProps.properties")); myProperties.load(fis); System.out.println(myProperties.getProperty("ServerName")); System.out.println(myProperties.getProperty("CustomProperty")); 我可以轻松地用C#加载文件并解析每一行,但是是否有一种内置的方式可以轻松获取属性,而不必自己解析键名和等号? 我发现的C#信息似乎总是偏爱XML,但这是我无法控制的现有文件,我希望将其保留为现有格式,因为它需要更多时间才能让另一个团队将其更改为XML。而不是解析现有文件。 回答1 没有对此的内置支持。 您必须创建自己的“ INIFileReader”。 也许是这样的吗? var
  • 我可以在 C++ 函数 getline 中使用 2 个或更多分隔符吗? [复制](Can I use 2 or more delimiters in C++ function getline? [duplicate])
    问题 这个问题在这里已经有了答案: 如何在 C++ 中读取和解析 CSV 文件? (39 个回答) 2年前关闭。 我想知道如何在 getline 函数中使用 2 个或更多分隔符,这是我的问题: 该程序读取一个文本文件......每一行都将是这样的: New Your, Paris, 100 CityA, CityB, 200 我正在使用 getline(file, line),但我得到了整行,当我想得到 CityA,然后是 CityB,然后是数字; 如果我使用 ',' 分隔符,我不知道下一行是什么时候,所以我试图找出一些解决方案.. 但是,我怎么能使用逗号和 \n 作为分隔符呢? 顺便说一句,我正在操作字符串类型,而不是字符,所以 strtok 是不可能的:/ 一些划痕: string line; ifstream file("text.txt"); if(file.is_open()) while(!file.eof()){ getline(file, line); // here I need to get each string before comma and \n } 回答1 您可以使用std::getline读取一行,然后将该行传递给 std::stringstream 并从中读取逗号分隔值 string line; ifstream file("text.txt")
  • Java - 用整数和字符串解析文本文件(Java - Parsing a text file with integers and strings)
    问题 我有一个包含以下内容的文本文件(分隔符是一个空格): 1231 2134 143 wqfdfv -89 rwq f 8 qer q2 sl;akfj salfj 3 sl 123 我的目标是分别读取整数和字符串。 一旦我知道如何解析它们,我将创建另一个输出文件来保存它们(但我的问题只是知道如何解析这个文本文件)。 我尝试使用 Scanner,但无法超越第一个 inetger: Scanner s = new Scanner (new File ("a.txt")).useDelimiter(""); while (s.hasNext()){ System.out.print(s.nextInt());} 输出是 1231 我怎样才能从这两行中获得其他整数? 我想要的输出是: 1231 2134 143 -89 8 3 123 回答1 分隔符应该是至少一个或多个空格之类的东西 Scanner s = new Scanner (new File ("a.txt")).useDelimiter("\\s+"); while (s.hasNext()) { if (s.hasNextInt()) { // check if next token is an int System.out.print(s.nextInt()); // display the found integer
  • 如何在熊猫中读取以空格分隔的值的文件(How to read file with space separated values in pandas)
    问题 我尝试将文件读入熊猫。 该文件具有以空格分隔的值,但是我尝试使用不同数量的空格: pd.read_csv('file.csv', delimiter=' ') 但这不起作用 回答1 添加delim_whitespace=True参数,它比regex更快。 回答2 您可以使用正则表达式作为分隔符: pd.read_csv("whitespace.csv", header=None, delimiter=r"\s+") 回答3 如果无法使用接受的答案来进行文本解析(例如,如果您的文本文件包含不统一的行),则值得尝试使用Python的csv库-这是一个使用用户定义的方言的示例: import csv csv.register_dialect('skip_space', skipinitialspace=True) with open(my_file, 'r') as f: reader=csv.reader(f , delimiter=' ', dialect='skip_space') for item in reader: print(item)
  • Text File Parsing with Python
    I am trying to parse a series of text files and save them as CSV files using Python (2.7.3). All text files have a 4 line long header which needs to be stripped out. The data lines have various delimiters including " (quote), - (dash), : column, and blank space. I found it a pain to code it in C++ with all these different delimiters, so I decided to try it in Python hearing it is relatively easier to do compared to C/C++. I wrote a piece of code to test it for a single line of data and it works, however, I could not manage to make it work for the actual file. For parsing a single line I was
  • 拆分包含字母和数字的字符串,在 PHP 中不被任何特定的分隔符分隔(Splitting string containing letters and numbers not separated by any particular delimiter in PHP)
    问题 目前我正在开发一个 Web 应用程序来获取 Twitter 流并尝试自己创建一个自然语言处理。 由于我的数据来自 Twitter(限制为 140 个字符),因此缩短了许多单词,或者在这种情况下,省略了 space 。 例如: "Hi, my name is Bob. I m 19yo and 170cm tall" 应该被标记为: - hi - my - name - bob - i - 19 - yo - 170 - cm - tall 请注意, 19yo中的19和yo之间没有空格。 我主要用它来提取带有单位的数字。 简单地说,我需要的是一种通过不带分隔符的数字或字母块“分解”每个包含数字的标记的方法。 '123abc'将是['123', 'abc'] 'abc123'将是['abc', '123'] 'abc123xyz'将是['abc', '123', 'xyz'] 等等。 在 PHP 中实现它的最佳方法是什么? 我发现了一些接近它的东西,但它是 C#,特别是用于日/月拆分。 如何根据字母和数字在 C# 中拆分字符串 回答1 您可以使用 preg_split $string = "Hi, my name is Bob. I m 19yo and 170cm tall"; $parts = preg_split("/(,?\s+)|((?<=[a-z])(?=\d))|(
  • 在 C# 中写入 CSV 时,数字字段丢失前导零(Numeric fields lose leading zero while writing CSV in c#)
    问题 我正在使用 ASP.NET 应用程序将我的客户数据导出到 CSV,我需要我的客户电话号码与前导零。 我需要电话号码不带“-”且不带引号,并且由于我的应用程序的性质,我不能使用 EPPLUS 等 3rd 方产品。 我试图放一个空格,让 CSV“理解”我需要电话号码作为文本,但这似乎不对。 我想知道如何在不使用第 3 方产品的情况下使 excel 包含前导零。 谢谢 回答1 使用以下格式更改保存在 csv 中的数据: ="00023423" CSV 示例: David,Sooo,="00023423",World 这将在 excel 中显示 00023423 而不是 23423。 回答2 public void CreatingCsvFiles(Client client) { string filePath = "Your path of the location" + "filename.csv"; if (!File.Exists(filePath)) { File.Create(filePath).Close(); } string delimiter = ","; string[][] output = new string[][]{ new string[]{ "=\"" + client.phone + "\"", client.name } }; int
  • dos批处理通过带分隔符的字符串进行迭代(dos batch iterate through a delimited string)
    问题 我有一个定界的IP地址,我想单独处理。 列表长度是未知的。 如何拆分和处理列表中的每个项目? @echo off set servers=127.0.0.1,192.168.0.1,10.100.0.1 FOR /f "tokens=* delims=," %%a IN ("%servers%") DO call :sub %%a :sub echo In subroutine echo %1 exit /b 输出: In subroutine 127.0.0.1 In subroutine ECHO is off. 更新:使用弗朗西的答案作为参考,这是解决方案: @echo off set servers=127.0.0.1,192.168.0.1,10.100.0.1 call :parse "%servers%" goto :end :parse setlocal set list=%1 set list=%list:"=% FOR /f "tokens=1* delims=," %%a IN ("%list%") DO ( if not "%%a" == "" call :sub %%a if not "%%b" == "" call :parse "%%b" ) endlocal exit /b :sub setlocal echo In subroutine