-1

我有一个带有以下标题的 .csv 文件和文件中的示例行。

AgentID,Profile,Avatar,In_Time,Out_Time,In_Location,Out_Location,Target_Speed(m/s),Distance_Traveled(m),Congested_Duration(s),Total_Duration(s),LOS_A_Duration(s),LOS_B_Duration(s),LOS_C_Duration(s),LOS_D_Duration(s),LOS_E_Duration(s),LOS_F_Duration(s)
2177,DefaultProfile,DarkGreen_LowPoly,08:00:00,08:00:53,East12SubwayportalActor,EWConcourseportalActor,1.39653,60.2243,5.4,52.8,26.4,23,3.4,0,0,0

我需要通过增加时间(08:00:00、08:00:01)和第 6 列(In_Location)按字母方向(例如东、北等)按第 4 列(In_time)对这个 .csv 进行排序。

到目前为止,我的代码如下所示:

List<string> list = new List<string>();
using (StreamReader reader = new StreamReader("JourneyTimes.csv"))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        line.Split(',');
        list.Add(line);
    }

我在 .csv 中阅读并使用逗号将其拆分(没有其他逗号,所以这不是问题)。然后我将每一行添加到一个列表中。我的问题是如何根据两个参数和.csv 的标题对列表进行排序。

我一直在看这个,我对编程比较陌生,这是我的第一个程序,所以我为我缺乏知识而道歉。

4

3 回答 3

5

您可以使用LINQ OrderBy / ThenBy

例如

listOfObjects.OrderBy (c => c.LastName).ThenBy (c => c.FirstName)

但首先,您应该将您的CSV线映射到某个对象。要将线映射CSV到对象,您可以预定义某种类型或动态创建它

from line in File.ReadLines(fileName).Skip(1) //header
let columns = line.Split(',') //really basic CSV parsing, consider removing empty entries and supporting quotes
select new
{
  AgentID = columns[0],
  Profile = int.Parse(columns[1]),
  Avatar = float.Parse(columns[2])
  //other properties
}

请注意,与许多其他 LINQ 方法一样,这两种方法使用延迟执行

于 2013-05-13T20:27:50.520 回答
0

您正在处理两个不同的问题。

一、C#中对两列排序可以用OrderBy、ThenBy实现

public class SpreadsheetExample
{
    public DateTime InTime { get; set; }
    public string InLocation { get; set; }

    public SpreadsheetExample(DateTime inTime, string inLocation)
    {
        InTime = inTime;
        InLocation = inLocation;
    }

    public static List<SpreadsheetExample> LoadMockData()
    {
        int maxMock = 10;
        Random random = new Random();
        var result = new List<SpreadsheetExample>();
        for (int mockCount = 0; mockCount < maxMock; mockCount++)
        {
            var genNumber = random.Next(1, maxMock);
            var genDate = DateTime.Now.AddDays(genNumber);
            result.Add(new SpreadsheetExample(genDate, "Location" + mockCount));
        }

        return result;
    }
}

internal class Class1
{
    private static void Main()
    {
        var mockData = SpreadsheetExample.LoadMockData();
        var orderedResult = mockData.OrderBy(m => m.InTime).ThenBy(m => m.InLocation);//Order, ThenBy can be used to perform ordering of two columns

        foreach (var item in orderedResult)
        {
            Console.WriteLine("{0} : {1}", item.InTime, item.InLocation);
        }
    }
}

现在您可以解决将数据从 Excel 移动到类的第二个问题。 VSTO是您正在寻找的。网上有很多例子。按照我上面发布的示例进行操作。将您的自定义类替换为SpreadSheetExample.

于 2013-05-13T20:41:25.560 回答
0

您可以使用DataTable

var lines = File.ReadAllLines("test.csv");
DataTable dt = new DataTable();
var columNames = lines[0].Split(new char[] { ',' });
for (int i = 0; i < columNames.Length; i++)
{
    dt.Columns.Add(columNames[i]);
}

for (int i = 1; i < lines.Length; i++)
{
    dt.Rows.Add(lines[i].Split(new char[] { ',' }));
}

var rows = dt.Rows.Cast<DataRow>();
var result = rows.OrderBy(i => i["In_time"])
    .ThenBy(i => i["In_Location"]);

// sum
var sum = rows.Sum(i => Int32.Parse(i["AgentID"].ToString()));
于 2013-05-13T20:36:54.347 回答