我正在尝试使用我的.CSV文件上的StreamReader生成项ID(它必须是.csv文件)。物品ID应从1000开始并上升(1001,1002等)
现在,如果用户按下“生成ID”,它将在整个文件中搜索值“1000”,如果它不存在,它将在文本框中写入“1000”。
以下是我需要帮助的内容:如果文件包含“1000”,我希望它读取最后一行,将其增加1,然后在文本框中写入值。所以,如果.csv文件中的最后一个值是1005,我希望它在文本框中写入1006。
private void GenerateID_Click(object sender, EventArgs e)
{
try
{
string searchString = "1000";
using (StreamReader sr = new StreamReader("file.csv"))
{
string line;
while ((line = sr.ReadLine()) != null)
{
if (line.Contains(searchString))
{
/* If file contains 1000, read the LAST line
* (Whatever number that may be: 1001, 1002, 1003, etc.)
* and increase that number by 1, then write to textbox. */
}
else
{
invItemIDField.Text = Convert.ToString("1000");
}
}
}
}
catch (Exception)
{
MessageBox.Show("The file could not be read");
}
}
答案 0 :(得分:3)
我建议你使用FileHelpers。它是最适合读取CSV文件的库。
要安装此功能,您需要先安装NuGet。安装完成后,转到工具>库包管理器>软件包管理器控制台:
然后,输入:Install-Package Filehelpers
你很高兴去!
将FileHelpers
导入您的代码
using FileHelpers;
创建一个描述CSV结构的类:
DelimitedRecord("'")]
public class MyCsv
{
public int Column1; // Your ID column
public string SomeOtherColumn;
}
创建List<MyCsv>
:
List<MyCsv> myList;
然后,加载您的CSV:
FileHelperEngine<MyCsv> engine = new FileHelperEngine<MyCsv>();
myList = new List<MyCsv>(engine.ReadFile("my.csv")); // replace with your filename or variable containing the filename
您现在可以通过访问列表myList
:
foreach(MyCsv line in myList) {
// Do something;
}
该列表中的每个对象都对应于CSV中的每一行。为了访问行的第一列(给定上面的foreach
循环):
line.Column1
因此,如果您需要比较值,您可以使用LINQ或进行传统的循环搜索:
foreach(MyCsv line in myList) {
if (txtId.Text == line.Column1.ToString()) {
found = true;
break;
}
}
然后,获取最后一行的id:
myList.[myList.Count - 1].Column1
你可以做其余的事。干杯!
答案 1 :(得分:2)
这是我的目标,它与你的不同,但它有效。当然,您必须考虑的事项,例如引号中包含的元素,换行符\ r \ n等等:
int TextBoxValue = 1000;
var reader = new StreamReader(File.OpenRead(@"C:\Users\J\Desktop\New Text Document (4).txt"));
var contents = reader.ReadToEnd().Split(new string[] {"\r\n"}, StringSplitOptions.None);
var iValueExists = (from String sLine in contents
where sLine.Contains("1000")
select sLine).Count();
if (iValueExists > 0)
{
TextBoxValue = int.Parse(contents.Last().Split(new string[] {","}, StringSplitOptions.None).First()) + 1;
}
invItemIDField.Text = TextBoxValue;
reader.Close();