このStackOverflowの記事を読んだ後、CSVファイルで同じ問題が発生していることに気付きました。つまり、誰かがダッシュ/ハイフン(-)文字をWordからExcelにコピーして貼り付けた場合です。
Excelスプレッドシートから読み取ったデータを使用して独自のCSVファイルを作成していましたが、メモ帳で表示したときに表示されなかった、Excelに表示されるなどの奇妙な文字に気づきました。SSISを使用してCSVファイルをSQLServerテーブルに転送したとき、奇妙なものがそこにも残っていました。それぞれのASC値を調べた後、ASC 150(ダッシュ)をASC 45(ハイフン)文字に置き換えることにしました。これにより問題が修正され、Excelで表示してもハイフンは正常に表示されました。
これにより、他のどの文字も置き換える必要があるのか、CSVファイルを同様の問題から保護するために使用できる一般的なルーチンがあるのかどうか疑問に思いました。
これは、CSVファイルに書き込みたいすべての値に対して現在行っていることです。私のgetCharacterString関数は、ASCII値に関連付けられたASC文字を返すという点でVBのCHR関数に似ていることに注意してください。
/// <summary>
/// Locates occurrences of targeted special characters found in the input string and replaces each with a space.
/// </summary>
/// <param name="inputString">The input string.</param>
/// <returns>The updated inputString.</returns>
private string ReplaceSpecialCharacters(string inputString)
{
StringBuilder stringBuilder = new StringBuilder(inputString);
const string doubleQuoteCharacter = "\"";
stringBuilder.Replace("\r\n", " "); // Carriage Return/Line Feed characters replaced with single space
stringBuilder.Replace("\r", " "); // Carriage Return replaced with one space if only \r is found
stringBuilder.Replace("\n", " "); // Likewise, Line Feed with a single space
stringBuilder.Replace(this.columnSeparator, " "); // Tab
stringBuilder.Replace(Character.GetCharacterString(150), Character.GetCharacterString(45)); // Replace Dash with Hypen
stringBuilder.Replace(Character.GetCharacterString(147), doubleQuoteCharacter); // Replace angled left quote, “, with simple double quote, ".
stringBuilder.Replace(Character.GetCharacterString(148), doubleQuoteCharacter); // Replace angled left quote, “, with simple double quote, ".
return stringBuilder.ToString();
}
私が見つけた変換関数は次のとおりです。
// -----------------------------------------------------------------------
// <copyright file="Character.cs" company="Joes bar and grill">
// TODO: Update copyright text.
// </copyright>
// -----------------------------------------------------------------------
namespace JoesBarAndGrill.FinanceIT.HhsSweeper
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/// <summary>
/// TODO: Update summary.
/// </summary>
public static class Character
{
/// <summary>
/// See http://bytes.com/topic/c-sharp/answers/273734-c-chr-asc-function-equivalents-undocumented-truth.
/// </summary>
/// <param name="asciiValue"></param>
/// <returns></returns>
public static string GetCharacterString(int asciiValue)
{
if ((asciiValue < 0) || (asciiValue > 255))
{
throw new ArgumentOutOfRangeException("asciiValue", asciiValue, "Must be between 0 and 255.");
}
byte[] bytBuffer = new byte[] { (byte)asciiValue };
return Encoding.GetEncoding(1252).GetString(bytBuffer);
}
public static int GetAsciiValue(string character)
{
if (character.Length != 1)
{
throw new ArgumentOutOfRangeException("character", character, "Must be a single character.");
}
char[] chrBuffer = { Convert.ToChar(character) };
byte[] bytBuffer = Encoding.GetEncoding(1252).GetBytes(chrBuffer);
return (int)bytBuffer[0];
}
}
}
繰り返しますが、私の質問はこれです:
このような変換の問題が発生する可能性のあるすべての文字を特定するための一般的なアプローチを考え出すには、何をする必要がありますか?私は一般的なものだけを特定したかもしれないと思います。また、置換するターゲット文字と提案された置換文字のより完全なリストを作成するのを手伝ってもらうことにも興味があります。
これが関連しているかどうかはわかりませんが、CSVファイルでテキスト区切り文字を使用するように提案された場合、SSIS 2008で正しく処理されないと確信しているため、テキスト修飾子を使用していません(前の質問を参照してください)。私の)