Windows 8 App从CSV文件中提取数据

时间:2015-07-21 03:26:55

标签: c# wpf xaml csv windows-8.1

所以我非常擅长制作应用程序(或一般的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#中的新功能并且没有任何代码片段有效。

1 个答案:

答案 0 :(得分:0)

如果是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);
}

现在您可以处理内容了,您可以先用&#39; \ r&#39;或者使用FileIO使用StreamReader。

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

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

然后处理文件