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

xatchikzzz

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

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

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 373
Благодарностей
3 297
Баллы
113
Прямая работа с файлом по пути из 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

heks

Client
Регистрация
01.10.2013
Сообщения
1 082
Благодарностей
263
Баллы
83
куйворд кипер
если не получится
 

xatchikzzz

Client
Регистрация
08.09.2010
Сообщения
566
Благодарностей
38
Баллы
28
Прямая работа с файлом по пути из 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 строк что сделает скрипт ? Заберёт последнее или напишет что не хватает ?
 

xatchikzzz

Client
Регистрация
08.09.2010
Сообщения
566
Благодарностей
38
Баллы
28
А можно добавить что б после взятия из файла 1.txt строки с этого файла удалялись...

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

МОЖНО подправить скрипт чтоб можно было с ним работать в многопотоке.... память он конечно тоже забивает ...
 

zarufakis

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

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

xatchikzzz

Client
Регистрация
08.09.2010
Сообщения
566
Благодарностей
38
Баллы
28
Мне для решения нетривиальной задачи по разрезанию видео на несколько частей для загрузки постом помог чатгпт, правда пришлось его немного поупрашивать))
Просто как совет, где можно искать достаточно хорошие ответы.
И нейрона, заточенная чисто под кодинг https://chat.deepseek.com/coder тоже помогает регулярно.
спасибо попробую сформулировать свою мысль чтоб он ее понял ))
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 373
Благодарностей
3 297
Баллы
113
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 765
Благодарностей
2 407
Баллы
113
В общем есть файл 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;
}

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

xatchikzzz

Client
Регистрация
08.09.2010
Сообщения
566
Благодарностей
38
Баллы
28
Я резал таким фрагментом кода на части большой файл.
Количество строк указывал вручную в коде.

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 это созданный список в самой зенке.... да и после взятия надо сразу удалять из файла .. потмоу что шаблон может не отработать к примеру прям весь файл .... вдруг свет отубится потом все занова проверять такое себе ..
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 373
Благодарностей
3 297
Баллы
113
File.WriteAllLines(fileName, chunk);
А вы проверяли с файлом на 15кк строк? Сколько у вас памяти забрало и как продолжительно?

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

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 765
Благодарностей
2 407
Баллы
113
А вы проверяли с файлом на 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 установить номером предпоследнего созданого файла тем самым сместиться на размер предыдущих файлов, а последний созданный удалить.
 

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