在 c# 中将.csv中的单独列拉入单独的数组中
本文关键字:单独 数组 单独列 csv 中将 | 更新日期: 2023-09-27 18:35:49
这个项目的背景。它最初是一个简单的家庭作业,需要我存储 5 个邮政编码及其相应的城市。当用户在文本框中输入邮政编码时,将返回相应的城市,同样可以执行相反的操作。我编写了代码来返回这些值,但后来我决定将所有邮政编码及其相应的城市存储在外部.csv中,并将这些值存储在数组中并运行代码,因为如果值得做,那就值得过度!澄清一下,这不再用于家庭作业,只是为了了解有关在 C# 中使用外部文件的更多信息。
在下面的代码中,我已经调用以成功打开文件,现在我只需要帮助弄清楚如何提取存储在两个单独列中的数据(一个用于城市,一个用于邮政编码)并将它们存储在两个数组中由 for 循环操作。这是我现在拥有的代码。您可以看到我之前如何将其他值存储在数组中并将它们拉出:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void btnConvert2City_Click(object sender, EventArgs e)
{
try
{
string dir = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location);
string path = dir + @"'zip_code_database_edited.csv";
var open = new StreamReader(File.OpenRead(path));
int EnteredZipcode = Convert.ToInt32(txtZipcode.Text.Trim());
string result = "No Cities Found";
string[] Cities = new String[5] { "FLINTSTONE", "JAMAICA", "SCHENECTADY", "COTTONDALE", "CINCINNATI" };
int[] Zipcode = new int[5] { 30725, 11432, 12345, 35453, 45263 };
for (int i = 0; i <= Zipcode.Length - 1; i++)
{
if (Zipcode[i] == EnteredZipcode)
{
result = Cities[i];
break;
}
}
string DisplayState = result;
txtCity.Text = DisplayState;
}
catch (FormatException)
{
MessageBox.Show("Input must be numeric value.");
}
catch (OverflowException)
{
MessageBox.Show("Zipcode to long. Please Re-enter");
}
}
private void btnConvert2Zipcode_Click(object sender, EventArgs e)
{
string dir = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location);
string path = dir + @"'zip_code_database_edited.csv";
var open = new StreamReader(File.OpenRead(path));
String EnteredCity = txtCity.Text.ToUpper();
string result = "No Zipcode Found";
string[] Cities = new String[5] { "FLINTSTONE", "JAMAICA", "SCHENECTADY", "COTTONDALE", "CINCINNATI" };
int[] Zipcode = new int[5] { 30725, 11432, 12345, 35453, 45263 };
for (int i = 0; i <= Cities.Length - 1; i++)
{
if (Cities[i] == EnteredCity)
{
result = Convert.ToString(Zipcode[i]);
break;
}
}
string DisplayZip = result;
txtZipcode.Text = DisplayZip;
}
}
以下数据是我的 excel .csv中的数据样子片段:
zip,primary_city
44273,Seville
44274,Sharon Center
44275,Spencer
44276,Sterling
44278,Tallmadge
44280,Valley City
44281,Wadsworth
44282,Wadsworth
44285,Wayland
以此类推,大约 46,000 行。
如何将 zip 和primary_city拉成两个单独的数组(我猜有一些".拆分","行)我的for循环可以操作吗?
另外,如果有更好的方法可以解决这个问题,请告诉我(但一定要留下解释,因为我想了解你来自哪里)。
不要创建两个单独的数组。为城市创建单独的类
class City
{
public string Name{get;set;}
public int ZipCode{get;set;}
}
现在从该 csv 文件中读取数据
List<City> cities=File.ReadAllLines(path)
.Select(x=>new City
{
ZipCode=int.Parse(x.Split(',')[0]),
Name=x.Split(',')[1]
}).ToList<City>();
或者你可以这样做
List<City> cities=new List<City>();
foreach(String s in File.ReadAllLines(path))
{
City temp=new City();
temp.ZipCode=int.Parse(s.Split(',')[0]);
temp.Name=s.Split(',')[1];
cities.Add(temp);
}
你可以试试这个:
string dir = System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location);
string path = dir + @"'zip_code_database_edited.csv";
var open = new StreamReader(File.OpenRead(path));
var cities = new HashList<string>();
var zipCodes = new HashList<int>();
var zipAndCity = new string[2];
string line = string.Empty;
using (open)
{
while ((line = reader.ReadLine()) != null)
{
zipAndCity = line.Split(",");
zipCodes.Add(int.Parse(zipAndCity[0]));
cities.Add(zipAndCity[1]);
}
}
我发布这个问题以来,我正在发布这个答案,因为我对 C# 有了更多的了解。阅读CSV时,有比String.Split()
更好的选择。
.NET Framework已经有一个名为TextFieldParser
的内置专用CSV解析器。
它位于Microsoft.VisualBasic.FileIO
命名空间中。
不仅有许多边缘情况String.Split()
没有正确处理,而且使用StreamReader
的速度也慢得多。