Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/DbfDataReader/DbfDataReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,21 +20,21 @@ public DbfDataReader(string path)
public DbfDataReader(string path, DbfDataReaderOptions options)
{
_options = options;
DbfTable = new DbfTable(path, options.Encoding);
DbfTable = new DbfTable(path, options.Encoding, options.StringTrimming);
DbfRecord = new DbfRecord(DbfTable);
}

public DbfDataReader(Stream stream, DbfDataReaderOptions options)
{
_options = options;
DbfTable = new DbfTable(stream, options.Encoding);
DbfTable = new DbfTable(stream, options.Encoding, options.StringTrimming);
DbfRecord = new DbfRecord(DbfTable);
}

public DbfDataReader(Stream stream, Stream memoStream, DbfDataReaderOptions options)
{
_options = options;
DbfTable = new DbfTable(stream, memoStream, options.Encoding);
DbfTable = new DbfTable(stream, memoStream, options.Encoding, options.StringTrimming);
DbfRecord = new DbfRecord(DbfTable);
}

Expand Down
10 changes: 10 additions & 0 deletions src/DbfDataReader/DbfDataReaderOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,19 @@ public DbfDataReaderOptions()
{
SkipDeletedRecords = false;
Encoding = null;
StringTrimming = StringTrimmingOption.Trim;
}

public bool SkipDeletedRecords { get; set; }
public Encoding Encoding { get; set; }
public StringTrimmingOption StringTrimming { get; set; }
}

public enum StringTrimmingOption
{
None,
Trim,
TrimStart,
TrimEnd,
}
}
6 changes: 4 additions & 2 deletions src/DbfDataReader/DbfRecord.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,14 @@ public class DbfRecord
private const byte EndOfFile = 0x1a;

private readonly Encoding _encoding;
private readonly StringTrimmingOption _stringTrimming;
private readonly int _recordLength;
private readonly byte[] _buffer;

public DbfRecord(DbfTable dbfTable)
{
_encoding = dbfTable.CurrentEncoding;
_stringTrimming = dbfTable.StringTrimming;
_recordLength = dbfTable.Header.RecordLength;
_buffer = new byte[_recordLength];

Expand Down Expand Up @@ -77,10 +79,10 @@ private IDbfValue CreateDbfValue(DbfColumn dbfColumn, DbfMemo memo)
break;
case DbfColumnType.General:
case DbfColumnType.Character:
value = new DbfValueString(dbfColumn.Start, dbfColumn.Length, _encoding);
value = new DbfValueString(dbfColumn.Start, dbfColumn.Length, _encoding, _stringTrimming);
break;
case DbfColumnType.WideCharacter:
value = new DbfValueWideString(dbfColumn.Start, dbfColumn.Length);
value = new DbfValueWideString(dbfColumn.Start, dbfColumn.Length, _stringTrimming);
break;
default:
value = new DbfValueNull(dbfColumn.Start, dbfColumn.Length);
Expand Down
12 changes: 8 additions & 4 deletions src/DbfDataReader/DbfTable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ public class DbfTable : Disposable
{
private const byte Terminator = 0x0d;

public DbfTable(string path, Encoding encoding = null)
public DbfTable(string path, Encoding encoding = null, StringTrimmingOption stringTrimming = StringTrimmingOption.Trim)
{
if (!File.Exists(path)) throw new FileNotFoundException();

Path = path;
CurrentEncoding = encoding;
StringTrimming = stringTrimming;

Stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);

Expand All @@ -24,15 +25,16 @@ public DbfTable(string path, Encoding encoding = null)
if (!string.IsNullOrEmpty(memoPath)) Memo = CreateMemo(memoPath);
}

public DbfTable(Stream stream, Encoding encoding = null)
: this(stream, null, encoding)
public DbfTable(Stream stream, Encoding encoding = null, StringTrimmingOption stringTrimming = StringTrimmingOption.Trim)
: this(stream, null, encoding, stringTrimming)
{
}

public DbfTable(Stream stream, Stream memoStream, Encoding encoding = null)
public DbfTable(Stream stream, Stream memoStream, Encoding encoding = null, StringTrimmingOption stringTrimming = StringTrimmingOption.Trim)
{
Path = string.Empty;
CurrentEncoding = encoding;
StringTrimming = stringTrimming;
Stream = stream;

Init();
Expand Down Expand Up @@ -60,6 +62,8 @@ private void Init()

public IList<DbfColumn> Columns { get; private set; }

public StringTrimmingOption StringTrimming { get; private set; }

public bool IsClosed => Stream == null;

public void Close()
Expand Down
24 changes: 22 additions & 2 deletions src/DbfDataReader/DbfValueString.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,18 @@ public class DbfValueString : DbfValue<string>
{
private const char NullChar = '\0';

public DbfValueString(int start, int length, Encoding encoding) : base(start, length)
public DbfValueString(int start, int length, Encoding encoding) : this(start, length, encoding, StringTrimmingOption.Trim)
{
}

public DbfValueString(int start, int length, Encoding encoding, StringTrimmingOption stringTrimming) : base(start, length)
{
Encoding = encoding;
StringTrimming = stringTrimming;
}

protected readonly Encoding Encoding;
protected readonly StringTrimmingOption StringTrimming;

public override void Read(ReadOnlySpan<byte> bytes)
{
Expand All @@ -23,7 +29,21 @@ public override void Read(ReadOnlySpan<byte> bytes)
}

var value = Encoding.GetString(bytes);
Value = value.Trim(NullChar, ' ');
Value = TrimString(value);
}

private string TrimString(string value)
{
var trimmedNull = value.Trim(NullChar);

return StringTrimming switch
{
StringTrimmingOption.None => trimmedNull,
StringTrimmingOption.Trim => trimmedNull.Trim(' '),
StringTrimmingOption.TrimStart => trimmedNull.TrimStart(' '),
StringTrimmingOption.TrimEnd => trimmedNull.TrimEnd(' '),
_ => trimmedNull.Trim(' '),
};
}
}
}
25 changes: 23 additions & 2 deletions src/DbfDataReader/DbfValueWideString.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,16 @@ public class DbfValueWideString : DbfValue<string>
{
private const char NullChar = '\0';

public DbfValueWideString(int start, int length) : base(start, length)
public DbfValueWideString(int start, int length) : this(start, length, StringTrimmingOption.Trim)
{
}

public DbfValueWideString(int start, int length, StringTrimmingOption stringTrimming) : base(start, length)
{
StringTrimming = stringTrimming;
}

protected readonly StringTrimmingOption StringTrimming;

public override void Read(ReadOnlySpan<byte> bytes)
{
Expand All @@ -20,7 +27,21 @@ public override void Read(ReadOnlySpan<byte> bytes)
}

var value = Encoding.Unicode.GetString(bytes);
Value = value.Trim(NullChar, ' ');
Value = TrimString(value);
}

private string TrimString(string value)
{
var trimmedNull = value.Trim(NullChar);

return StringTrimming switch
{
StringTrimmingOption.None => trimmedNull,
StringTrimmingOption.Trim => trimmedNull.Trim(' '),
StringTrimmingOption.TrimStart => trimmedNull.TrimStart(' '),
StringTrimmingOption.TrimEnd => trimmedNull.TrimEnd(' '),
_ => trimmedNull.Trim(' '),
};
}
}
}
Loading