Skip to main content

Can't delete "^M\n" from a .txt file

I'm generating a .txt from a SQL database. But for some reason, some of my data is not just plain text.

My .txt file looks like this:

PC001|1FSTFJ|BE21|Rooftop 
PC002|JVQ2F9|BE22|Basement
PC003|JY1035W1|BE22|Basement^M\n

I tried some Python and Bash scripts with the help of gpt, but it doesn't work:

#!/bin/bash

file_path="file.txt"

sed -i 's/\^M\n//g' "$file_path"

This script literally does nothing, and I don't understand why.

And the Python script:

def clean_file(file_path):
    try:
        with open(file_path, 'r') as file:
            lines = file.readlines()

        cleaned_lines = []
        for line in lines:
            # Diviser la ligne en champs, en supposant qu'ils sont séparés par '|'
            fields = line.strip().split('|')
            
            # Nettoyer chaque champ individuellement
            cleaned_fields = [field.rstrip('M').strip() for field in fields]

            # Recombiner les champs nettoyés en une seule ligne
            cleaned_line = '|'.join(cleaned_fields)
            cleaned_lines.append(cleaned_line)

        with open(file_path, 'w') as file:
            # Écrit toutes les lignes nettoyées, avec un saut de ligne approprié après chaque ligne
            file.write('\n'.join(cleaned_lines))

        print("Le fichier a été nettoyé avec succès.")
    except Exception as e:
        print(f"Une erreur s'est produite : {str(e)}")

file_path = 'file.txt'

clean_file(file_path)

I also tried with .replace, because I saw that it could work, but it didn't for me.

def clean_file(file_path):
    try:
        with open(file_path, 'r') as file:
            lines = file.readlines()

        cleaned_lines = []
        for line in lines:
            # Diviser la ligne en champs, en supposant qu'ils sont séparés par '|'
            fields = line.split('|')
            
            # Nettoyer chaque champ individuellement
            cleaned_fields = [field.replace('M\n', '').strip() for field in fields]

            # Recombiner les champs nettoyés en une seule ligne
            cleaned_line = '|'.join(cleaned_fields).rstrip('\n')
            cleaned_lines.append(cleaned_line)

        with open(file_path, 'w') as file:
            file.write('\n'.join(cleaned_lines))

        print("Le fichier a été nettoyé avec succès.")
    except Exception as e:
        print(f"Une erreur s'est produite : {str(e)}")

file_path = 'file.txt'

clean_file(file_path)

With both Python scripts, I get this kind of result:

PC001|1FSTFJ|BE21|Rooftop 
PC002|JVQ2F9|BE22|Basement
PC003|JY1035W1|BE23|Basement
\n
PC004|FFJSFH43|BE24|Rooftop 

So there's not more ^M but there's still the \n, and it's on the next line.



source https://stackoverflow.com/questions/77805995/cant-delete-m-n-from-a-txt-file

Comments