Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换CSV文件中的特殊字符_C#_Ssis - Fatal编程技术网

C# 替换CSV文件中的特殊字符

C# 替换CSV文件中的特殊字符,c#,ssis,C#,Ssis,在阅读了StackOverflow的文章后,我意识到我的CSV文件也存在同样的问题,即有人将Word中的破折号/hypen(-)字符复制并粘贴到Excel中 我正在用从Excel电子表格读取的数据创建自己的CSV文件,我注意到Excel中出现的–等奇怪字符在记事本中查看时没有出现。当我使用SSI将CSV文件传输到SQL Server表时,奇怪的情况也一直存在。在检查了每个字符的ASC值后,我决定将ASC 150(破折号)替换为和ASC 45(连字符),这纠正了问题,并且在Excel中查看时,hy

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

我正在用从Excel电子表格读取的数据创建自己的CSV文件,我注意到Excel中出现的–等奇怪字符在记事本中查看时没有出现。当我使用SSI将CSV文件传输到SQL Server表时,奇怪的情况也一直存在。在检查了每个字符的ASC值后,我决定将ASC 150(破折号)替换为和ASC 45(连字符),这纠正了问题,并且在Excel中查看时,hypen显示正常

这让我怀疑还有哪些字符可能需要替换,以及是否有一个通用的例程可以用来保护我的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();
    }         
//
///查找在输入字符串中找到的目标特殊字符,并用空格替换每个字符。
/// 
///输入字符串。
///更新的输入字符串。
专用字符串替换特殊字符(字符串输入字符串)
{
StringBuilder StringBuilder=新的StringBuilder(inputString);
常量字符串doubleQuoteCharacter=“\”;
stringBuilder.Replace(“\r\n”,”);//回车符/换行符替换为单空格
stringBuilder.Replace(“\r”,”);//如果只找到一个空格,则回车符替换为一个空格
stringBuilder.Replace(“\n”,”);//同样,换行符也要有一个空格
stringBuilder.Replace(this.columnseptor,“”;//选项卡
stringBuilder.Replace(Character.GetCharacterString(150),Character.GetCharacterString(45));//用Hypen替换短划线
stringBuilder.Replace(Character.GetCharacterString(147),doubleQuoteCharacter);//将有角度的左引号“”替换为简单的双引号“”。
stringBuilder.Replace(Character.GetCharacterString(148),doubleQuoteCharacter);//将有角度的左引号“”替换为简单的双引号“”。
返回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];
        }
    }
}
//-----------------------------------------------------------------------
// 
//TODO:更新版权文本。
// 
// -----------------------------------------------------------------------
命名空间JoesBarAndGrill.FinanceIT.HhsSweeper
{
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
/// 
///TODO:更新摘要。
/// 
公共静态类字符
{
/// 
///看http://bytes.com/topic/c-sharp/answers/273734-c-chr-asc-function-equivalents-undocumented-truth.
/// 
/// 
/// 
公共静态字符串GetCharacterString(int-Ascivalue)
{
如果((ascivalue<0)| |(ascivalue>255))
{
抛出新ArgumentOutOfRangeException(“Ascivalue”,Ascivalue,“必须介于0和255之间”);
}
byte[]bytBuffer=新字节[]{(字节)ascivalue};
返回编码.GetEncoding(1252).GetString(bytBuffer);
}
公共静态整型GetAscivalue(字符串字符)
{
if(character.Length!=1)
{
抛出新ArgumentOutOfRangeException(“字符”,字符,“必须是单个字符”);
}
char[]chrBuffer={Convert.ToChar(character)};
byte[]bytBuffer=Encoding.GetEncoding(1252).GetBytes(chrBuffer);
返回(int)bytBuffer[0];
}
}
}
我的问题是:

我需要做些什么才能找到一种通用方法来识别所有可能会出现这种转换问题的字符?我想我可能只识别了常见的字符。我还希望有人能帮助我找到一个更完整的要替换的TargetCharacter列表和建议的替换字符


我不确定这是否相关,但如果有人建议我在CSV文件中使用文本分隔符,我不会使用文本限定符,因为我确信SSIS 2008无法正确处理它们(请参见)

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

在SSIS之前,我们使用"将字符转换为基本ascii值。我没有考虑如何在.NET中最好地处理它。为了便于讨论,最好使用字符串生成器多次替换和重建该字符串。@Nick,谢谢。我使用字符串生成器进行字符串连接操作,但从未注意到有SB对象上的替换函数。谢谢。代码已更新。这可能不是编码问题。MS Word有时会将“标准”字符替换为排版字符。替换为”或例如。听起来你不想简单地删除非ASCII字符。你想逐个处理它们,并尝试用ASCII等效字符替换它们吗?考虑到这一点,我决定如果用户使用Excel打开CSV文件以调整数据,他们应该能够查看有意义的字符。更改代码页只会更改加载数据的方式。