替换CSV文件中的特殊字符

时间:2013-01-03 21:12:02

标签: c# ssis

在阅读了this StackOverflow文章后,我意识到我的CSV文件存在同样的问题,即有人将Word中的破折号/超级( - )字符复制并粘贴到Excel中。

我正在创建自己的CSV文件,其中包含从Excel电子表格中读取的数据,我注意到在Excel中出现的奇怪字符,这些字符在记事本中查看时未显示。当我使用SSIS将CSV文件传输到SQL Server表时,奇怪的东西也在那里持续存在。在检查每个ASC值之后,我决定用ASC 45(连字符)字符替换ASC 150(Dash),这样就纠正了问题,并且在Excel中查看时也显示正常。

这让我质疑其他角色可能还需要更换,以及是否有一般程序用于保护我的CSV文件不会出现类似问题。

这就是我目前正在为我要写入CSV文件的每个值所做的事情。请注意,我的getCharacterString函数类似于VB的CHR函数,返回与ASCII值关联的ASC charact。

    /// <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无法正确处理它们(请参阅{ {3}})

1 个答案:

答案 0 :(得分:2)

删除所有脚本代码。编辑平面文件的Connection对象。将代码页更改为65001(UTF-8)。