2

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

我正在使用从 Excel 电子表格中读取的数据创建自己的 CSV 文件,并且我注意到奇怪的字符,例如出现在 Excel 中,而在记事本中查看时没有出现。当我使用 SSIS 将 CSV 文件传输到 SQL Server 表时,奇怪的 †也持续存在。在检查了每个 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 不能正确处理它们(请参阅之前的问题我的

4

1 回答 1

2

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

于 2013-01-07T02:51:43.297 回答