Разделить txt файл весом 250 гб.

Axel

Client
Регистрация
20.03.2017
Сообщения
122
Благодарностей
6
Баллы
18
Добрый день,

ищу решение как разделить файл с данными в 250 гб. Кубики "Списки" положили практически машину.

Может есть решение C# например,
вычитать файл и разделить его на части по 50 000 строк. Пусть файлов будет очень много но такой размер отработается хорошо новым проектом.

Подскажите решение, как подойти к файлам такого веса. Спасибо за любую помощь.
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 565
Благодарностей
1 166
Баллы
113
Мне кажется, проще найти специальную программу (название не вспомню, но точно были такие, когда-то давно надо было, изучал вопрос), а не пытаться его в зенку запихать.
Ну или у того же ChatGPT запросить скрипт на python, думаю, там буквально несколько строк будет.

C#:
string inputFile = project.Variables["link"].Value; // путь к исходному файлу
string outputDirectory = project.Variables["folder"].Value; // папка для сохранения разбитых файлов
int linesPerFile = 5000; // количество строк в одном файле

if (!System.IO.Directory.Exists(outputDirectory))
{
    System.IO.Directory.CreateDirectory(outputDirectory);
}

try
{
    using (System.IO.StreamReader reader = new System.IO.StreamReader(inputFile))
    {
        int fileIndex = 1;
        int lineCount = 0;
        System.IO.StreamWriter writer = null;

        while (!reader.EndOfStream)
        {
            // Создаем новый файл, если необходимо
            if (lineCount % linesPerFile == 0)
            {
                if (writer != null)
                {
                    writer.Close(); // закрываем предыдущий файл, если он был
                }
                string outputFileName = outputDirectory + "\\part_" + fileIndex + ".txt"; 
                writer = new System.IO.StreamWriter(outputFileName);
                fileIndex++;
            }

            // Читаем строку и записываем в текущий файл
            string line = reader.ReadLine();
            writer.WriteLine(line);
            lineCount++;
        }

        if (writer != null)
        {
            writer.Close();
        }
    }

    return 1;
}
catch (Exception ex)
{
    project.SendErrorToLog(ex.Message);
    return 0;
}
Да, частично GPT, но код проверил (что далеко не все делают), у меня отработал верно )) Но, повторюсь, в Зенку такое пихать, имхо, так себе вариант ))
 
Последнее редактирование:

t79

Client
Регистрация
29.04.2024
Сообщения
185
Благодарностей
65
Баллы
28
на виндах не подскажу, но на никсах и на маке можно в консоле побить файл через split

хотя сейчас у gpt спрошу


вот что ответило

Чтобы разделить большой текстовый файл на части с использованием командной строки, можно воспользоваться стандартными утилитами, такими как `split`, которая доступна на Unix-подобных системах (например, Linux или macOS). Для Windows можно использовать либо `split` в среде Git Bash или WSL (Windows Subsystem for Linux), либо команду PowerShell.

Вот несколько способов:

### 1. **Использование команды `split` в Linux/macOS или через Git Bash на Windows**

#### Разделение файла по числу строк
Например, если вы хотите разделить файл на части по 1000 строк каждая:

```bash
split -l 1000 yourfile.txt part_
```

Здесь:
- `-l 1000` указывает количество строк в каждой части (1000 строк).
- `yourfile.txt` — это исходный файл.
- `part_` — это префикс для новых файлов. Например, будут созданы файлы с именами `part_aa`, `part_ab` и так далее.

#### Разделение файла по размеру (например, по 1 МБ)
Чтобы разделить файл по размеру, можно использовать опцию `-b`:

```bash
split -b 1M yourfile.txt part_
```

Здесь `-b 1M` указывает, что каждая часть должна быть размером 1 МБ.

### 2. **Использование PowerShell в Windows**

В PowerShell можно написать скрипт для разделения текстового файла:

#### Разделение по числу строк:
```powershell
$linesPerFile = 1000
$counter = 1
Get-Content yourfile.txt | ForEach-Object {
$fileNumber = [math]::Ceiling($counter / $linesPerFile)
$outputFile = "part_$fileNumber.txt"
Add-Content $outputFile $_
$counter++
}
```

Этот скрипт разделит файл `yourfile.txt` на части по 1000 строк каждая, и каждая часть будет называться `part_1.txt`, `part_2.txt` и так далее.

### 3. **Использование Python для разделения файла**

Если у вас установлен Python, можно написать простой скрипт для разделения файла:

```python
def split_file(file_path, lines_per_file):
with open(file_path, 'r') as file:
lines = file.readlines()

for i in range(0, len(lines), lines_per_file):
with open(f'part_{i//lines_per_file + 1}.txt', 'w') as out_file:
out_file.writelines(lines[i:i + lines_per_file])

split_file('yourfile.txt', 1000)
```

Этот скрипт разделит файл на части по 1000 строк и сохранит их в файлы `part_1.txt`, `part_2.txt` и так далее.

### Заключение
Выбор метода зависит от вашей операционной системы и предпочитаемого инструмента. `split` — это самый быстрый и простой способ для Unix-подобных систем, а для Windows можно использовать либо PowerShell, либо Python.



а такой объем пытаться на лету через зенно обработать, - утопия, как на мой взгляд)))) дроби файл изначально


однако, если содержание файла тебе кусками нужно в моменте - тогда на помощь тебе mysql - клади свои данные в базу
 

Sherminator

Client
Регистрация
10.09.2021
Сообщения
1 228
Благодарностей
665
Баллы
113
Добрый день,

ищу решение как разделить файл с данными в 250 гб. Кубики "Списки" положили практически машину.

Может есть решение C# например,
вычитать файл и разделить его на части по 50 000 строк. Пусть файлов будет очень много но такой размер отработается хорошо новым проектом.

Подскажите решение, как подойти к файлам такого веса. Спасибо за любую помощь.
C#:
string pathToInputFile = project.Variables["ПЕРЕМЕННАЯ С ПУТЁМ К ФАЙЛУ"].Value;
try
{
    if (!System.IO.File.Exists(pathToInputFile))
    {
        project.SendInfoToLog($"Файл не существует: {pathToInputFile}");
        return 1;
    }

    using (System.IO.StreamReader reader = new System.IO.StreamReader(pathToInputFile))
    {
        int fileIndex = 1;
        int currentLineCount = 0;
        string line;
        System.IO.StreamWriter writer = null;
        string outputDirectory = Path.GetDirectoryName(pathToInputFile);

        if (outputDirectory == null)
        {
            project.SendInfoToLog("Не удается определить каталог для выходных файлов.");
            return 1;
        }

        while ((line = reader.ReadLine()) != null)
        {
            if (currentLineCount % 50000 == 0) // количество строк для одного файла
            {
                if (writer != null)
                {
                    writer.Close();
                }

                string newFileName = System.IO.Path.Combine(outputDirectory, $"{System.IO.Path.GetFileNameWithoutExtension(pathToInputFile)}_Part{fileIndex}{System.IO.Path.GetExtension(pathToInputFile)}");
                writer = new System.IO.StreamWriter(newFileName);
                project.SendInfoToLog($"Создаем файл: {newFileName}");
                fileIndex++;
            }

            writer.WriteLine(line);
            currentLineCount++;
        }

        if (writer != null)
        {
            writer.Close();
            project.SendInfoToLog("Закончили.");
        }
    }
}
catch (Exception ex)
{
    project.SendInfoToLog($"Ошибка: {ex.Message}");
}
 

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