URL: https://linuxfr.org/users/desktop-ready-0/journaux/en-finir-avec-csv-ou-excel-pour-echanger-des-donnees Title: En finir avec CSV ou Excel pour échanger des données Authors: desktop.ready Date: 2020年10月06日T16:57:24+02:00 License: CC By-SA Tags: excel, csv, ascii, tableur et microsoft_office Score: 19 Du Excel-engineering dans tout sa splendeur: [Excel: Why using Microsoft's tool caused Covid-19 results to be lost](https://www.bbc.com/news/technology-54423988) Mais je suis aussi à blâmer: j'ai souvent utilisé Excel ou CSV pour échanger des données alors que je sais pertinemment que c'est mal. Je ne compte pas les soucis que j'ai eu à cause d'un mauvais formatage de fichiers CSV (texte non quoté, retour à la ligne dans les valeurs, texte avec guillemets, etc.). Ou encore Excel qui persiste à interpréter "00123" comme "123". Je me suis donc enfin décider à chercher une alternative. Après avoir jeté oeil sur [DIF](https://fr.wikipedia.org/wiki/Data_Interchange_Format) et [SYLK](https://fr.wikipedia.org/wiki/Symbolic_Link), je suis tombé sur [ASCII Delimited Text](https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text): [Text File formats – ASCII Delimited Text – Not CSV or TAB delimited text](https://ronaldduncan.wordpress.com/2009/10/31/text-file-formats-ascii-delimited-text-not-csv-or-tab-delimited-text/) Le gros soucis c'est que ce format n'est supporté par personne. Même vim ou emacs l'affiche bizarrement. Celui qui s'en sort le mieux out-of-the-box est Notepad++. Mais bon dans l'idée on n'édite pas un tel fichier à la main, donc ce n'est pas grave. Je me suis donc inspiré d'un [bout de code](https://stackoverflow.com/a/30226173) pour proposer un convertisseur de "ASCII Delimited Text" en Excel. C'est très moche je trouve mais je n'ai pas réussi à faire plus simple (si quelqu'un arrive à faire plus simple, défi TapTempo !). ```python from openpyxl import Workbook import csv, argparse def readlines(f, newline='\n'): while True: line = [] while True: ch = f.read(1) if ch == '': # end of file? return elif ch == newline: # end of line? line.append('\n') break line.append(ch) yield ''.join(line) def process(input, output): wb = Workbook(write_only=True) ws = wb.create_sheet() with open(input, 'r', encoding='utf-8') as f: reader = csv.reader(readlines(f, newline=chr(30)), delimiter=chr(31)) [ws.append(row) for i,row in enumerate(reader)] wb.save(output) if __name__ == '__main__': parser = argparse.ArgumentParser(description='convert to xlsx') parser.add_argument('input', help='csv file') parser.add_argument('output', help='xlsx file') args = parser.parse_args() process(args.input, args.output) ``` Et vous de votre côté ? Vous utilisez quoi pour échanger des données ? SQLite ? Note: impossible de mettre un exemple de "ASCII Delimited Text", même linuxfr n'est pas compatible :-(