Isso é um caso simples de buffering e streaming. Vou dar um exemplo de como faria com c++ já que esse foi meu trabalho de estrutura de dados
int main(){
data_auxiliar data_struct;
string linha;
string csvNomeArquivo = "call911_1.csv";
int tamanho_arquivo = ContarLinhas(csvNomeArquivo);
fstream file_input, file_output;
file_input.open(csvNomeArquivo, ios::in);
file_output.open("output.bin", ios::binary | ios::out | ios::app);
if (file_input && file_output){
getline(file_input, linha);
for (int i = 0; i < tamanho_arquivo; i++){
cout << "[OK]: Convertendo linha: " << i << " do arquivo " << csvNomeArquivo << "\r";
cout.flush();
getline(file_input >> ws, linha);
file_output.write(reinterpret_cast<char*>(&data_struct), sizeof(data_struct));
}
cout << endl;
}
Gostaria de lembrar que este código é incompleto para seu caso e foi retirado exclusivamente do meu repositório que foi criado exclusivamente para converter arquivos .csv
Então poderia precisar de um work around.
Mas teoricamente a prática é a mesma, tu conta o número de linhas e utiliza um for-loop com um getline para pegar cada linha e salvar depois processar e salvar