只需要CSV文件中每行的最后几项

时间:2017-09-03 05:31:05

标签: c# csv split

我有一个CSV文件(使用';'作为分隔符)。我使用了StreamReader来读取文件的每一行。该文件包含近4000行,每行有16列。我只需要每行最后5个数字,但我不确定如何分割每一行并只获得最后5个数字。

示例数据:

  

2002; 10 ;; 0; 0 EUR; 122; 448 823 EUR; 8315; 6 973 EUR; 192233; 586 EUR; 6; 13; 55; 66; 81
  2002; 9 ;; 0; 0 EUR; 62; 750 138 EUR; 4784; 10 294 EUR; 137390; 697 EUR; 13; 51; 55; 62; 74
  2002; 8 ;; 0; 0 EUR; 56; 801 650 EUR; 6377; 7 454 EUR; 177197; 522 EUR; 12; 13; 19; 28; 85

因此,对于第一行,我实际需要的数据是{ 6; 13; 55; 66; 81 }

3 个答案:

答案 0 :(得分:0)

您可以使用String.Split方法轻松完成此操作。

foreach(var line in file)
{
    var result = test.Split(';');
    var last = result.Length-1;
    var first = result[last-4];
    var second = result[last-3];
    var third = result[last-2];
    var fourth = result[last-1];
    var fifth = result[last];
}

作为旁注,我在处理CSV文件时发现非常有用的库是LINQtoCSV。有一个NuGet包可用,因此可以轻松添加到项目中。如果您将不得不对此数据执行任何其他操作,您可能需要查看它。

修改
以下是使用LINQtoCSV执行此操作的示例。如果您阅读文档,他们会展示如何设置一个您可以阅读的类型更强的类,为简单起见,我只是以原始的方式进行。

// Define the class for reading, both IDataRow and DataRowItem
// are part of the LINQtoCSV namespace
public class MyRow : List<DataRowItem>, IDataRow
{
}

// Create the context, the file description and then read the file.
var context = new CsvContext();
var inputFileDescription = new CsvFileDescription
{
    SeparatorChar = ';',
    FirstLineHasColumnNames = false, // Change this if yours does
};

// Note: You don't need to use your stream reader, just use the LINQtoCSV
// Read method to load the data into an IEnumerable. You can read the
// documentation for more information and options on loading/reading the
// data.
var products = context.Read<MyRow>(@"yourfile.csv", inputFileDescription);

// Iterate all the rows and grab the last 5 items from the row
foreach (var row in products)
{
    var last = row.Count - 1;
    var first = row[last - 4];
    var second = row[last - 3];
    var third = row[last - 2];
    var fourth = row[last - 1];
    var fifth = row[last];
}

答案 1 :(得分:0)

我正在根据您提供的示例编写逻辑的一部分。这将拆分整行并返回数组中的最后五个数字。

string row = "2002; 10; ; 0; 0 EUR; 122; 448 823 EUR; 8315; 6 973 EUR; 192233; 586 EUR; 6; 13; 55; 66; 81";
string[] rowArray = row.Trim().Split(';');
string[] numbers = rowArray.Skip(Math.Max(0, rowArray.Length - 5)).ToArray();

numbers将包含您可以使用索引访问的所有最后五个数字 - numbers[0], numbers[1],,依此类推..直至numbers[4]

注意:您必须将从StreamReader读取的数据拆分为行。你获得行,循环遍历每一行,并使用上面三行代码来获取最后五行数字。

答案 2 :(得分:0)

您可以尝试使用Cinchoo ETL库来解析文件并访问最后5位成员,如下所示

foreach (dynamic rec in new ChoCSVReader("quotes.csv").WithDelimiter(";"))
{
    Console.WriteLine("{0}", rec[11]);
    Console.WriteLine("{0}", rec[12]);
    Console.WriteLine("{0}", rec[13]);
    Console.WriteLine("{0}", rec[14]);
    Console.WriteLine("{0}", rec[15]);
}