【问题标题】:Windows 8 App extract data from CSV filesWindows 8 App 从 CSV 文件中提取数据
【发布时间】:2026-02-16 11:00:02
【问题描述】:

所以我在制作应用程序(或一般的 GUI 程序)方面非常陌生,但我觉得我可以接受这个挑战,因为我非常擅长 Python 和 VBA。我正在尝试使用在 C# 和 xaml 中运行的 Windows 8 应用程序为我的大学制作可视化日程表生成器应用程序。所有课程的数据都被分割成 .csv 文件,每个部门一个,以便于搜索。这些文件将包含在应用程序本身的资产中,因为我现在不想弄清楚如何远程托管数据(除非这会使这项任务更容易)。

我无法将这些文件中的数据提取到我的应用程序中。在我的应用程序中,我目前正在处理两个组合框。一个用于部门,一个用于该部门内的课程,例如机械工程特定课程的 MECH 2202。我希望当为 MECH 选择第一个组合时,第二个组合填充该部门中所有不同的课程代码,这些代码位于单个 .csv 文件中。稍后选择课程代码时将使用更多详细信息,因为每个部分都有几个部分,但稍后可以弄清楚。

用于测试的相关 xaml 如下。第二个框中的数字只是暂时的。

        <ComboBox x:Name="departmentCombo" HorizontalAlignment="Center" Margin="0" Grid.Row="1" VerticalAlignment="Center" Width="100" Height="40" MaxDropDownHeight="400" SelectionChanged="DepartmentChange">
            <ComboBoxItem Content="BIOE"/>
            <ComboBoxItem Content="CIVL"/>
            <ComboBoxItem Content="ECE"/>
            <ComboBoxItem Content="ENG"/>
            <ComboBoxItem Content="MECH"/>
        </ComboBox>
        <ComboBox x:Name="courseCombo" HorizontalAlignment="Center" Margin="0" Grid.Row="1" VerticalAlignment="Center" Width="100" Height="40" MaxDropDownHeight="400">
            <ComboBoxItem Content="2012"/>
            <ComboBoxItem Content="2202"/>
            <ComboBoxItem Content="3542"/>
            <ComboBoxItem Content="3582"/>
            <ComboBoxItem Content="3980"/>
        </ComboBox>

例如,所有机械工程课程都位于应用资产中名为“Course List_MECH.csv”的单个 .csv 文件中。数据结构如下:

    department,course_code,[several other non-relevant fields]

到目前为止,在选择部门后,我的 C# 代码是这样的:

    private void DepartmentChange(object sender, SelectionChangedEventArgs e)
    {

        ComboBoxItem typeItem = (ComboBoxItem)departmentCombo.SelectedItem;
        string department_str = typeItem.Content.ToString();

        testText.Text = department_str;

        ///broken
        var reader = new StreamReader(File.OpenRead(@"C:\test.csv"));
        List<string> listA = new List<string>();
        List<string> listB = new List<string>();
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(';');

            listA.Add(values[0]);
            listB.Add(values[1]);
        }
    }

此代码的第一部分用于提取所选部门并进入测试文本块以确保其正常工作。所以我在格式化文件名以找到正确的部门文件时不会有任何问题。问题是评论被破坏并且不起作用之后的一切。我从Reading CSV file and storing values into an array 中提取了这篇文章。我在 C# 方面不够熟练,无法理解为什么它甚至没有编译。它说“当前上下文中不存在名称'文件'”。一旦我将所有课程代码放入一个数组中,我确信我可以毫不费力地让它填充第二个组合框,它将数据放入那些我无法弄清楚的数组(或列表可能更好)中.

任何帮助将不胜感激。我已经搜索了这个问题的答案,但我得到的任何东西都不足以让我理解 C# 的新手并且没有代码 sn-ps 起作用。

【问题讨论】:

  • 如果你尝试过: var reader = new StreamReader("C:\test.csv");它还会给你错误吗?

标签: c# wpf xaml csv windows-8.1


【解决方案1】:

如果是 Windows 8 应用程序,则不能直接从所需路径读取,而不能从 C: 读取。您必须使用 FileOpenPicker 才能访问文件

var picker = new FileOpenPicker() { SuggestedStartLocation = PickerLocationId.DocumentsLibrary};
picker.FilterType.Add(".csv");

var file = await picker.PickSingleFileAsync();
if(file!=null)
{
    var content = await FileIO.ReadTextAsync(file);
}

现在您可以处理内容了,您可以先使用 '\r' 进行拆分,或者 FileIO 使用 StreamReader。

可以读取项目内部的文件,将csv文件添加为内容,然后

string filePath = @"ms-appx:///test.csv";
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(filePath));
var content = await FileIO.ReadTextAsync(file);

然后处理文件

【讨论】:

  • 你的第二段代码看起来很简单,也是我要找的,今晚晚些时候我回家后试试。您能告诉我如何处理该文件吗?我是否只使用我发布的代码的第二部分(在我声明一个名为 reader 的变量的行之后)?还是有更好的方法可以附加到您的代码中以将数据放入列表中?如果这是python我会做 > > 并且它会在之后的所有内容列表中完成第一个逗号。
  • 好的,我试过了。我收到一条错误消息,提示找不到文件。我的文件路径字符串是@"ms-appx:///Assets/CourseList_MECH.csv"。我已经验证该文件位于项目的 assets 文件夹中,以及默认的启动图像。我试过移动它,重命名它,没有任何效果。
  • 在文件的属性中你必须将它设置为 Content
  • 感谢您的帮助!经过一堆修补后,我让它工作并且我的组合框可以填充。
  • 如果答案带您解决问题,您可以将其标记为答案吗?这有助于人们知道是否遵循答案,谢谢!