Read/write til csv fil
Hej,Jeg har fundet en klasse på nettet, som skulle gøre det nemt at skrive/læst til/fra en csv fil. I den forbindelse har jeg nogle problemer, som jeg håber I kan hjælpe mig med;
1) Når jeg skriver til en fil, laver den æ ø og å om til mærkelige tegn.
2) Når jeg læser fra en csv fil, hvor der pænt står æ ø og å så indlæser den disse til mærkelige tegn.
Hvordan ændrer jeg det så den pænt skriver æ ø og å og hvordan ændrer jeg det, så den også læser æ ø og å som æ ø og å?
3) Når jeg åbner en csv fil i Excel 2010 (aner ikke om dette også er gældende i ældre udgiver) (som jeg har lavet som komma separeret fil), skriver den det i en lang streng. Altså Excel deler den ikke op i kolonner.
Hvordan får jeg Excel til at indlæse csv filen så den opdeler i kolonner og ikke tager en række som en lang streng?
Klassen som jeg bruger:
public class CsvRow : List<string>
{
public string LineText { get; set; }
}
public class CsvFileWriter : StreamWriter
{
public CsvFileWriter(Stream stream)
: base(stream)
{
}
public CsvFileWriter(string filename)
: base(filename)
{
}
/// <summary>
///
/// </summary>
/// <param name="row"></param>
public void WriteRow(CsvRow row)
{
StringBuilder builder = new StringBuilder();
foreach (string value in row)
{
// Add separator if this isn't the first value
if (builder.Length > 0)
builder.Append(',');
if (value.IndexOfAny(new char[] { '"', ',' }) != -1)
{
// Special handling for values that contain comma or quote
// Enclose in quotes and double up any double quotes
builder.AppendFormat("\"{0}\"", value.Replace("\"", "\"\""));
}
else builder.Append(value);
}
row.LineText = builder.ToString();
WriteLine(row.LineText);
}
}
public class CsvFileReader : StreamReader
{
public CsvFileReader(Stream stream)
: base(stream)
{
}
public CsvFileReader(string filename)
: base(filename)
{
}
/// <summary>
/// Reads a row of data from a CSV file
/// </summary>
/// <param name="row"></param>
/// <returns></returns>
public bool ReadRow(CsvRow row)
{
row.LineText = ReadLine();
if (String.IsNullOrEmpty(row.LineText))
return false;
int pos = 0;
int rows = 0;
while (pos < row.LineText.Length)
{
string value;
// Special handling for quoted field
if (row.LineText[pos] == '"')
{
// Skip initial quote
pos++;
// Parse quoted value
int start = pos;
while (pos < row.LineText.Length)
{
// Test for quote character
if (row.LineText[pos] == '"')
{
// Found one
pos++;
// If two quotes together, keep one
// Otherwise, indicates end of value
if (pos >= row.LineText.Length || row.LineText[pos] != '"')
{
pos--;
break;
}
}
pos++;
}
value = row.LineText.Substring(start, pos - start);
value = value.Replace("\"\"", "\"");
}
else
{
// Parse unquoted value
int start = pos;
while (pos < row.LineText.Length && row.LineText[pos] != ',')
pos++;
value = row.LineText.Substring(start, pos - start);
}
// Add field to list
if (rows < row.Count)
row[rows] = value;
else
row.Add(value);
rows++;
// Eat up to and including next comma
while (pos < row.LineText.Length && row.LineText[pos] != ',')
pos++;
if (pos < row.LineText.Length)
pos++;
}
// Delete any unused items
while (row.Count > rows)
row.RemoveAt(rows);
// Return true if any columns read
return (row.Count > 0);
}
}
Mvh.
simsen :-)