webmail123 Ответов: 3

Вставить файл\update .csv с помощью C#


Я пытаюсь вставить и/или обновить запись в файл .csv с помощью C#. У меня есть 3 текстовых поля, которые я должен вставить в файл (который будет вставлен в 3 разных столбца). Я говорил https://stackoverflow.com/questions/14370757/editing-saving-a-row-in-a-csv-file для обновления в файле .csv, но запись не вставляется и не обновляется вообще.
У меня есть 3 условия для проверки:
1. Если файл .csv пуст, то вставьте запись.
2. Если запись не существует, то вставьте новую запись.
3. Если запись существует, то обновите запись.

3 колонки которые я хочу вставить это
1. ID (строка)
2. номер партии (строка)
3. Местоположение (строка)

Что я уже пробовал:

String path = @"\Loc.csv";
List<String> lines = new List<String>();

if (File.Exists(path));
{
    using (StreamReader reader = new StreamReader(path))
    {
        String line;

        while ((line = reader.ReadLine()) != null)
        {
            if (line.Contains(","))
            {
                String[] split = line.Split(',');

                if (split[1].Contains(txtID.text))
                {
                    split[2] = txtBatch.text;
                    split[3] = txtLoc.text;                    
                }
            }

            lines.Add(line);
        }
    }

    using (StreamWriter writer = new StreamWriter(path, false))
    {
        foreach (String line in lines)
            writer.WriteLine(line);
    }
}


Изначально файл пуст. Итак, как я могу выполнить операцию вставки/обновления?

Member 14531967

можете ли вы разместить рабочую треску

3 Ответов

Рейтинг:
27

Dave Kreskowiak

Создайте класс, который инкапсулирует эти данные и управляет файлом. Он должен управлять данными в памяти и перезаписывать файл при вызове метода Save для класса или после каждой операции с данными.

Когда вы создаете экземпляр класса, передайте ему имя файла, которым он должен управлять.

Затем класс должен загрузить данные из этого файла, если он существует. Если нет, то ничего не предпринимайте.

Класс должен предоставлять методы для манипулирования данными, такие как вставка, обновление, удаление и управление этими данными в коллекции записей данных (другой класс!).

Когда придет время записать файл обратно, перечислите всю свою коллекцию и перепишите файл, который там находится, с данными, отформатированными как CSV.


Maciej Los

Коротко И По Существу!

webmail123

@Дейв. Спасибо за ответ. Я постараюсь сделать то же самое. :-)

Рейтинг:
2

Maciej Los

Прежде всего, пожалуйста, прочтите это: Зачем создавать свой собственный CSV-парсер (а может и нет)[^]

Правильный способ работы с данными csv заключается в использовании:
1. классы (см. Решение №1 по Дэйв Кресковяк[^]) тогда вы сможете читать, записывать данные
2. ADO.NET - OleDb

Пожалуйста, смотрите прошлые ответы:
Лучший способ обработки больших объемов CSV-данных?[^]
Чтение и запись CSV-файлов на языке C#[^]
Как читать из текстовых файлов с разделителями-запятыми в Visual Basic | Microsoft Docs[^]


webmail123

@Мачей. Спасибо за ответ. Думаю, я предпочту АДО.Чистый метод. Я буду искать на том же самом. Кстати, если у вас есть какой-нибудь пример того же самого, то не могли бы вы предоставить его мне для справки?

Maciej Los

VB.Net пример находится здесь: Чтение Столбцов Специфичных Для Текстового Файла
Его легко изменить на С#

webmail123

Большое спасибо..

Maciej Los

Всегда пожалуйста.
Неужели мой ответ был полезен? Если да, то, пожалуйста, примите мой ответ как решение (зеленая кнопка)...
Овации,
Мацей

webmail123

Я думаю, что не могу обновить файл .csv с помощью ADO.Чистый метод. Поэтому я пытаюсь использовать другой метод.

Maciej Los

Ты ошибаешься. Вы можете uspdate csv файл с помощью ado.net - оледб. Перейдите по ссылке, которую я предоставил.

webmail123

О, Хорошо. Я обязательно проверю и дам вам знать.

Рейтинг:
1

Member 11881188

Существует множество библиотек DLL с открытым исходным кодом excel reader и writer, таких как EPPLUS, NPOI.
вот пример кода, который я разработал в одном из своих проектов, он больше ориентирован на чтение данных, но у вас есть много возможностей для записи данных в отдельные ячейки, а также просто нужно изучить его. немного. Библиотека dll не требует установки MS office на сервер, так как она имеет открытый исходный код.

#region Read xlsx file
                  using (ExcelPackage package = new ExcelPackage())
                  {

                      package.Load(stream);
                      if (package.Workbook.Worksheets.Count > 1 && ReaderRequestEntity.firsttimeread == true)
                      {

                          foreach (var item in package.Workbook.Worksheets)
                          {
                              ReaderRequestEntity.SheetNamesList.Add(item.Name);
                          }
                      }
                      if (package.Workbook.Worksheets.Count == 0)
                          ReaderRequestEntity.Message = "Your Excel file does not contain any work sheets";
                      else
                      {
                          ExcelWorksheet workSheet = package.Workbook.Worksheets.First();

                          int EndColumn = workSheet.Dimension.End.Column > 50 ? 50 : workSheet.Dimension.End.Column;
                          foreach (var firstRowCell in workSheet.Cells[ReaderRequestEntity.HeaderRowNo, 1, ReaderRequestEntity.HeaderRowNo, EndColumn])
                          {
                              if (ReaderRequestEntity.firsttimeread != true && (firstRowCell.Text == null || firstRowCell.Text == ""))
                                  continue;
                              else
                                  table.Columns.Add(firstRowCell.Text);
                          }
                          for (var rowNumber = ReaderRequestEntity.HeaderRowNo; rowNumber <= workSheet.Dimension.End.Row; rowNumber++)
                          {
                              if (!ReaderRequestEntity.RowsTobeIngonredList.Contains(rowNumber.ToString()))
                              {
                                  int endcolumn = (ReaderRequestEntity.firsttimeread == true ? EndColumn : table.Columns.Count);

                                  var row = workSheet.Cells[rowNumber, 1, rowNumber, endcolumn];
                                  var newRow = table.NewRow();
                                  int j = 0;
                                  foreach (var cell in row)
                                  {
                                      try
                                      {
                                          newRow[j] = cell.Text;
                                          j++;
                                      }
                                      catch (Exception ex)
                                      {
                                          if (ex.Message.Contains("Cannot find column"))
                                          {
                                              table.Columns.Add("column" + j);
                                          }
                                      }
                                  }
                                  try
                                  {
                                      table.Rows.Add(newRow);
                                  }
                                  catch (Exception)
                                  {
                                      throw;
                                  }
                              }
                          }
                      }
                  }
                  #endregion

private void formatCellValue(ref ExcelWorksheet worksheet)
{
    DataTable dtColumnMapping = (DataTable)HttpContext.Current.Session["ColumnMappingTable"];
    int i = 0;
    foreach (DataRow item in dtColumnMapping.Rows)
    {
        if (item["Dbcolumntype"].ToString() == "date")
            worksheet.Column(i).Style.Numberformat.Format = "yyyy-mm-dd";
        i++;
    }
}

public int Calculatewidth(string firstRowCell)
{
    switch (firstRowCell.Length)
    {
        case 1 - 5:
            {
                return 75;
            }
        case 6 - 9:
            {
                return 120;
            }
        default:
            return 140;
    }
}

Вы можете получить очень хороший пример для того же самого в dev plex.


Richard Deeming

В этом вопросе нет никакого упоминания о чтении или записи файлов Excel.