# Data Interchange Format

Data Interchange Format (alias « Navy DIF », avec l'extension de fichier .dif) est un format de données ASCII conçu au début des années 1980 pour permettre la conversion de feuilles de calcul simples (un seul onglet) entre les SGBD d'alors : Lotus 1-2-3, FileMaker Pro, DBase, Framework, Multiplan, etc. Il peut être relu par OpenOffice, LibreOffice, Excel, Gnumeric et StarCalc. Sa principale limitation est qu'il ne permet pas de coder plusieurs onglets d'un tableur dans le même fichier.

## Historique

Le format DIF a été développé par Bob Frankston de Software Arts, Inc. pour VisiCalc au début des années 1980. Les spécifications de format étaient communiquées dans la documentation de VisiCalc, et furent même publiées dans le magazine Byte. Ce format DIF a été breveté en 1981 par Software Arts Products Corp. (raison sociale de Software Arts à l'époque).

## Syntaxe

Afin de s’affranchir des spécificités des différents formats utilisés par les logiciels du début des années 1980, DIF enregistre les données dans un fichier texte au format ASCII. Ce fichier comporte deux sections : une section d’en-tête et une section de données. Dans le format DIF, chaque section est constituée de bloc de 2 ou 3 lignes :
* l’en-tête est codée sur 3 lignes ;
* les sections de données commencent par un mot-clef en lettres capitales de moins de 32 lettres, ne comportant aucun chiffre. La ligne suivante est une paire de nombres, et la troisième ligne est une chaîne de caractère placée entre guillemets « anglaises » ("").
* Les données proprement dites sont codées sur deux lignes : la première contient l'indication de format (chaîne ou nombre) et
** un nombre muet si c'est une chaîne, le nombre dans l'autre cas ;
** sur la deuxième ligne, la chaîne proprement dite, ou une chaîne « informative » (V, ERROR, etc.) si c'est un nombre.

### L’en-tête de fichier

L’en-tête de fichier comporte une ligne de type suivie de deux lignes comportant chacune une valeur :
* TABLE - la première valeur contient le numéro de version, et la seconde ligne (désormais désuète) contenait un champ de commentaire générique.
Les différents champs de données sont marqués par l'une des balises :
* VECTORS permet d'encoder une ligne de valeurs ; la ligne 2 donne le nombre de colonnes.
* TUPLES (n-uplet) permet d'encoder une colonne de valeurs ; la ligne 2 donne le nombre de lignes.
* DATA - suivi d'un 0 conventionnel, puis des valeurs contenues dans le tableau, permet d'encoder un tableau de valeurs. Chaque ligne commence, conventionnellement, par le mot-clef BOT, et la dernière ligne de la table doit se terminer par le code EOD (« fin des données »).

### Les cellules

Chaque cellule est codée sur deux lignes :
* la première ligne contient une paire de nombres
* et la seconde ligne, soit une chaîne de caractères, soit un mot-clef.
Le premier nombre de la première ligne indique le type, le second nombre est ignoré. Les mots-clefs que l'on peut trouver à la ligne suivante sont :
* BOT – ce mot-clef indique que ce qui suit est un n-uplet (Beginning T-uple)
* EOD – marque la fin du bloc de données (End Of Data).
* 0 signale une valeur de type numérique ; dans ce cas, le nombre qui suit est la donnée proprement dite, et la ligne suivante contient l'un des mots-clefs :
** V – valeur réputée correcte
** NA – incompatibilité de type entre le préfixe et la valeur indiquée
** ERROR – erreur
** TRUE – valeur booléenne (« vrai »)
** FALSE – valeur booléenne (« fausse »)
* 1 signale une valeur de type chaîne; dans ce cas, le nombre qui suit est ignoré, et la ligne suivante contient la chaîne vide "" (entre guillemets).

### Implémentations hétérodoxes

Certaines implémentations (surtout celles des premiers logiciels de Microsoft) donnaient une interprétation inverse des formats VECTORS et TUPLES. Certaines implémentations ne tiennent même pas compte des dimensions indiquées dans l'en-tête : elles décodent les séparateurs de lignes du bloc de valeur, et ne tiennent compte que de cela.

### Exemple

Supposons par exemple que nous ayons à stocker une feuille de calcul comportant deux colonnes, avec une première ligne de titres, deux lignes d'en-tête de colonne et deux lignes de données :
| Texte | Données |
| bonjour | 1 |
| une guillemet double " dans le texte | -3 |
Le codage dans un fichier .dif donnerait :
| Code | Commentaires |
| TABLE | |
| 0,1 | |
| "EXCEL" | |
| VECTORS | mot-clef suivi de l'indication d'un nombre de colonnes : |
| 0,2 | '0' signale un champ de type numérique, '2' est le nombre de colonnes |
| TUPLES | mot-clef suivi de l'indication d'un nombre de lignes... |
| 0,3 | '0' signale un champ de type numérique, '3' est le nombre de lignes |
| DATA | suivi d'un 0 conventionnel, puis des données proprement dites |
| 0,0 | |
| -1,0 | '-1' signale une balise de bloc : 'BOT' ou 'EOD' |
| BOT | balise de début de ligne |
| 1,0 | '1' signale une valeur de type chaîne (le 0 qui suit est muet) |
| "Texte" | La chaîne contenue dans la cellule |
| 1,0 | '1' signale une valeur de type chaîne. |
| "Données" | La chaîne contenue dans la cellule |
| -1,0 | Préfixe d'une balise de bloc |
| BOT | Autre ligne contenant une chaîne ( (1,0) → "bonjour" ) , et un champ numérique ( (0,1) ) |
| 1,0 | |
| "bonjour" | |
| 0,1 | le champ numérique (0) contenant la valeur 1 |
| V | Donnée correcte (V signifie « valide »)! |
| -1,0 | Préfixe d'une balise de bloc |
| BOT | encore une ligne... |
| 1,0 | |
| "une guillemet double"" dans le texte" | |
| 0,-3 | une cellule numérique contenant la valeur -3 |
| V | |
| -1,0 | Préfixe d'une balise de bloc |
| EOD | Fin des données |

## Sources

* Jeff Walden, File Formats for Popular PC Software : A Programmer's Reference, John Wiley & Sons, Inc., 1986, 287 p. (ISBN 0-471-83671-0)
* Commentaires de Dan Bricklin, développeur de VisiCalc, sur la page de discussion WP:en
* Jeff Walden, Commodore 64 Data Files, A BASIC Tutorial., David Miller., 1984 (ISBN 0-8359-0791-0), p. 212-231.