#c# #csv
#c# #csv
Вопрос:
Я использую C # для создания небольшого приложения, которое автоматизирует некоторые ручные процессы. У меня есть CSV-файл, я должен выполнить поиск во втором столбце (который имеет название «Статус»), если статус «очищен», то мне не нужна эта строка, иначе мне нужно скопировать эту строку в другой файл и сохранить агрегированный файл. Кроме того, я также хотел бы знать, как удалить (автоматически) определенные столбцы CSV-файла в c #. Вот что у меня есть на данный момент: (Первая кнопка — «Показать оригинал», а вторая — «Изменить и сохранить»
namespace AppExcel
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private static List<string[]> ReadAndParseData(string path, char separator )
{
var parsedData = new List<string[]>();
using (var sr = new StreamReader(path))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string[] row = line.Split(separator);
string[] column = line.Split('n');
parsedData.Add(row);
}
}
return parsedData;
}
private void DrawGridView(List<string[]> parsedData)
{
dataGridView1.ColumnCount = 47;
for (int i = 0; i < 47; i )
{
var sb = new StringBuilder(parsedData[0][i]);
sb.Replace('_', ' ');
sb.Replace(""", "");
dataGridView1.Columns[i].Name = sb.ToString();
}
foreach (string[] row in parsedData)
{
dataGridView1.Rows.Add(row);
}
dataGridView1.Rows.Remove(dataGridView1.Rows[0]);
}
private void button1_Click(object sender, EventArgs e)
{
List<string[]> parsedData = ReadAndParseData(@"C:/Export Data.csv", ',');
DrawGridView(parsedData);
}
private void button2_Click(object sender, EventArgs e)
{
List<string[]> parsedData = ReadAndParseData(@"C:/Export Data.csv", ',');
foreach (string[] row in parsedData)
{
if (row != parsedData[0])
{
// What to insert here??
}
}
}
private void button3_Click(object sender, EventArgs e)
{
}
}
}
Ответ №1:
Вы можете просто выполнить (если ваш файл не очень большой: в этом случае вам придется работать с программой streamreader)
var retainedLines = File.ReadAllLines(@"C:/Export Data.csv")
.Skip(1) // if you have an header in your file and don't want it
.Where(x => x.Split(',')[1] != "clear");//don't take the lines with "clear" in second column
если вы хотите сохранить первую строку (заголовки), вы можете сделать
var retainedLines = File.ReadAllLines(@"C:/Export Data.csv")
.Where((x, i) => i == 0 || x.Split(',')[1] != "clear");//i is the index, so the first line will have i == 0
затем сохранить в другой файл
File.WriteAllLines(<targetPath>, retainedLines);
если вы хотите удалить строки из того же файла, ваш TargetPath должен быть просто существующим…
Ответ №2:
Одна строка для чтения файла, перехода по строкам, разделения на столбцы, проверки чистоты, а затем записи выходных данных.
File.WriteAllLines(outPath,
File
.ReadAllLines(inPath)
.Where(line => !line.Split(seperator)[colNum].Equals("clear")));