替换CSV文件中的特殊字符

本文关键字:特殊字符 文件 CSV 替换 | 更新日期: 2023-09-27 17:50:31

读完这篇StackOverflow文章后,我意识到我的CSV文件也有同样的问题,也就是说,有人从Word复制并粘贴了一个破折号/连字符(-)到Excel中。

我正在用从Excel电子表格中读取的数据创建自己的CSV文件,我注意到在Excel中出现的奇怪字符,如€,在记事本中查看时没有出现。当我使用SSIS将CSV文件传输到SQL Server表时,奇怪的也在那里持续存在。在检查了每个ASC值之后,我决定用ASC 45(连字符)字符替换ASC 150(破折号),这纠正了问题,在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不能正确处理它们(参见我之前的问题)

替换CSV文件中的特殊字符

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