Domanda

Ho un file di testo pieno di record in cui ogni campo in ogni record ha una larghezza fissa. Il mio primo approccio sarebbe quello di analizzare ogni record semplicemente usando string.Substring (). Esiste un modo migliore?

Ad esempio, il formato potrebbe essere descritto come:

<Field1(8)><Field2(16)><Field3(12)>

E un file di esempio con due record potrebbe apparire come:

SomeData0000000000123456SomeMoreData
Data2   0000000000555555MoreData    

Voglio solo assicurarmi di non trascurare un modo più elegante di Substring ().


Aggiornamento: alla fine sono andato con una regex come suggerito da Killersponge:

private readonly Regex reLot = new Regex(REGEX_LOT, RegexOptions.Compiled);
const string REGEX_LOT = "^(?<Field1>.{6})" +
                        "(?<Field2>.{16})" +
                        "(?<Field3>.{12})";

Uso quindi quanto segue per accedere ai campi:

Match match = reLot.Match(record);
string field1 = match.Groups["Field1"].Value;
È stato utile?

Soluzione

Il sottostringa suona bene per me. L'unico aspetto negativo a cui riesco immediatamente a pensare è che significa copiare i dati ogni volta, ma non mi preoccuperei fino a quando non dimostrerai che è un collo di bottiglia. La sottostringa è semplice :)

potresti usare una regex per abbinare un intero record alla volta e catturare i campi, ma penso che sarebbe eccessivo.

Altri suggerimenti

Usa FileHelpers .

Esempio:

[FixedLengthRecord()] 
public class MyData
{ 
  [FieldFixedLength(8)] 
  public string someData; 

  [FieldFixedLength(16)] 
  public int SomeNumber; 

  [FieldFixedLength(12)] 
  [FieldTrim(TrimMode.Right)]
  public string someMoreData;
}

Quindi, è semplice come questo:

var engine = new FileHelperEngine<MyData>(); 

// To Read Use: 
var res = engine.ReadFile("FileIn.txt"); 

// To Write Use: 
engine.WriteFile("FileOut.txt", res); 

Perché reinventare la ruota? Usa la TextFieldParser di .NET per questa come fare per Visual Basic .

Potrebbe essere necessario fare attenzione, se la fine delle linee non è riempita con spazi per riempire il campo, la sottostringa non funzionerà senza un po 'di giocherellare per capire quanto più della linea c'è leggere. Questo ovviamente si applica solo all'ultimo campo :)

Sfortunatamente, CLR fornisce solo sottostring per questo.

Qualcuno di CodeProject ha creato un parser personalizzato usando gli attributi per definire i campi , potresti volerlo vedere.

No, Sottostringa va bene. Ecco a cosa serve.

È possibile impostare un'origine dati ODBC per il file di formato fisso, quindi accedervi come qualsiasi altra tabella del database. Ciò ha l'ulteriore vantaggio che la conoscenza specifica del formato del file non viene compilata nel codice per quel fatidico giorno in cui qualcuno decide di inserire un campo in più nel mezzo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top