Нужно разбить файл на части .... но не просто

  • Автор темы Автор темы xatchikzzz
  • Дата начала Дата начала

xatchikzzz

Client
Регистрация
08.09.2010
Сообщения
588
Реакции
41
Баллы
28
В общем есть файл 900 мегабайт примерно 15 кк строк .... надо методом с # что из файла с:\1.txt надо взять первые 50 тысяч строк и положить их в список 1 принтом из файла 1.txt их удалить

может кто подсказать как реализовать
 
Последнее редактирование:
Прямая работа с файлом по пути из file_path.
Результат в таблицу Test.
C#:
Развернуть Свернуть Копировать
int lineCount = 50;

string file_path = project.Variables["file_path"].Value;
var list = project.Lists["Test"];

if (File.Exists(file_path))
{
    FileStream fs = null;
    
    try
    {
        fs = File.Open(file_path, FileMode.Open, FileAccess.Read, FileShare.None);
        
        using (var streamReader = new StreamReader(fs, Encoding.UTF8, true, 1024)) {
            String line;
            while ((line = streamReader.ReadLine()) != null && lineCount != 0)
            {
                lineCount--;
                list.Add(line);
            }
        }
    }
    catch (Exception e)
    {
        throw new Exception("Не удалось открыть файл: \"" + file_path + "\". Ошибка: " + e.Message);
    }
    finally
    {
        if (fs != null) {
            fs.Dispose();
        }
    }
} else {
    throw new Exception("Файл \"" + file_path + "\" не найден.");
}
 
  • Спасибо
Реакции: xatchikzzz
куйворд кипер
если не получится
 
Прямая работа с файлом по пути из file_path.
Результат в таблицу Test.
C#:
Развернуть Свернуть Копировать
int lineCount = 50;

string file_path = project.Variables["file_path"].Value;
var list = project.Lists["Test"];

if (File.Exists(file_path))
{
    FileStream fs = null;
   
    try
    {
        fs = File.Open(file_path, FileMode.Open, FileAccess.Read, FileShare.None);
       
        using (var streamReader = new StreamReader(fs, Encoding.UTF8, true, 1024)) {
            String line;
            while ((line = streamReader.ReadLine()) != null && lineCount != 0)
            {
                lineCount--;
                list.Add(line);
            }
        }
    }
    catch (Exception e)
    {
        throw new Exception("Не удалось открыть файл: \"" + file_path + "\". Ошибка: " + e.Message);
    }
    finally
    {
        if (fs != null) {
            fs.Dispose();
        }
    }
} else {
    throw new Exception("Файл \"" + file_path + "\" не найден.");
}
А можно добавить что б после взятия из файла 1.txt строки с этого файла удалялись...

И ещё если в файле останется 49 строк что сделает скрипт ? Заберёт последнее или напишет что не хватает ?
 
А можно добавить что б после взятия из файла 1.txt строки с этого файла удалялись...

И ещё если в файле останется 49 строк что сделает скрипт ? Заберёт последнее или напишет что не хватает ?

МОЖНО подправить скрипт чтоб можно было с ним работать в многопотоке.... память он конечно тоже забивает ...
 
В общем есть файл 900 мегабайт примерно 15 кк строк .... надо методом с # что из файла с:\1.txt надо взять первые 50 тысяч строк и положить их в список 1 принтом из файла 1.txt их удалить

может кто подсказать как реализовать
Мне для решения нетривиальной задачи по разрезанию видео на несколько частей для загрузки постом помог чатгпт, правда пришлось его немного поупрашивать))
Просто как совет, где можно искать достаточно хорошие ответы.
И нейрона, заточенная чисто под кодинг https://chat.deepseek.com/coder тоже помогает регулярно.
 
  • Спасибо
Реакции: samsonnn
Мне для решения нетривиальной задачи по разрезанию видео на несколько частей для загрузки постом помог чатгпт, правда пришлось его немного поупрашивать))
Просто как совет, где можно искать достаточно хорошие ответы.
И нейрона, заточенная чисто под кодинг https://chat.deepseek.com/coder тоже помогает регулярно.
спасибо попробую сформулировать свою мысль чтоб он ее понял ))
 
  • Спасибо
Реакции: BAZAg
В общем есть файл 900 мегабайт примерно 15 кк строк .... надо методом с # что из файла с:\1.txt надо взять первые 50 тысяч строк и положить их в список 1 принтом из файла 1.txt их удалить

может кто подсказать как реализовать

Я резал таким фрагментом кода на части большой файл.
Количество строк указывал вручную в коде.

C#:
Развернуть Свернуть Копировать
// Для файла меньше 2 миллиардов строк - работает нормально
string path = Path.Combine(project.Directory, "all.txt"); // путь к большому файлу
int chunkSize = 100000000; // Количество строк в новом файле
IEnumerable<string> data = File.ReadLines(path); // это получил на вход
int count = 782892874; // File.ReadLines(path).Count(); // Сколько строк в большом файле
int index = 0;
while (index < count ) {
    string fileName = Path.Combine(project.Directory, string.Format("{0}_{1}.txt", index, chunkSize)); // новое имя
    var chunk= data.Skip(index).Take(chunkSize); // берем указатели
    File.WriteAllLines(fileName, chunk); // записываем файл
    index += chunkSize;
}


Не нужно ничего удалять в большом файле.
Просто режем его на части как колбасу.
А потом - просто удаляем этот большой файл, если он больше не нужен.
Продолжаем работать исключительно уже с мелкими файлами.
 
Последнее редактирование:
Я резал таким фрагментом кода на части большой файл.
Количество строк указывал вручную в коде.

C#:
Развернуть Свернуть Копировать
// Для файла меньше 2 миллиардов строк - работает нормально
string path = Path.Combine(project.Directory, "all.txt"); // путь к большому файлу
int chunkSize = 100000000; // Количество строк в новом файле
IEnumerable<string> data = File.ReadLines(path); // это получил на вход
int count = 782892874; // File.ReadLines(path).Count(); // Сколько строк в большом файле
int index = 0;
while (index < count ) {
    string fileName = Path.Combine(project.Directory, string.Format("{0}_{1}.txt", index, chunkSize)); // новое имя
    var chunk= data.Skip(index).Take(chunkSize); // берем указатели
    File.WriteAllLines(fileName, chunk); // записываем файл
    index += chunkSize;
}



Не нужно ничего удалять в большом файле.
Просто режем его на части как колбасу.
А потом - просто удаляем этот большой файл, если он больше не нужен.
Продолжаем работать исключительно уже с мелкими файлами.
Проблема в том что список 1 это созданный список в самой зенке.... да и после взятия надо сразу удалять из файла .. потмоу что шаблон может не отработать к примеру прям весь файл .... вдруг свет отубится потом все занова проверять такое себе ..
 
File.WriteAllLines(fileName, chunk);
А вы проверяли с файлом на 15кк строк? Сколько у вас памяти забрало и как продолжительно?

StreamReader и StreamWriter тут самые адекватные варианты, но это видимо в платный раздел :bn:
 
Последнее редактирование:
  • Спасибо
Реакции: BAZAg
А вы проверяли с файлом на 15кк строк? Сколько у вас памяти забрало и как продолжительно?

StreamReader и StreamWriter тут самые адекватные варианты, но это видимо в платный раздел :bn:
Нагенерил где-то 200 000 000 строк (8 гб от 0 до 200кк).
Размером по 1кк резало достаточно шустро, но создавало много файлов, где-то на 15 файле прервал выполнение.
Поставил размер 10кк, начал резать - чуть дольше конечно, где-то на 5-м файле прервал выполнение.

ReadLines ложит в память исключительно 1 строку.
File.WriteAllLines(fileName, chunk); пишет не 1 строку, а сразу пачку.
Другими словами, память не кушает.

В целом я не вижу сложности написать решение на StreamReader и StreamWriter, просто мне не особо очевидна разница во времени, и придется делать там цикл в цикле, что как-то не очень интересно при файлах.

Проблема в том что список 1 это созданный список в самой зенке.... да и после взятия надо сразу удалять из файла .. потмоу что шаблон может не отработать к примеру прям весь файл .... вдруг свет отубится потом все занова проверять такое себе ..
Порезку большого файла на мелкие лучше делать отдельным шаблоном.
Если свет вырубится - тогда в моем коде int index = 0 установить номером предпоследнего созданого файла тем самым сместиться на размер предыдущих файлов, а последний созданный удалить.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)