C# 确定平面文件中的下线字符
我试图识别给定的.txt或.csv平面文件中的下线字符。根据平面文件中第一行数据的EOL字符,我希望相应地处理该文件中的数据(我正在使用Bulk Load在SQL Server上创建表,需要将EOL传递给Bulk Load命令)。据我所知,Readline()自动处理EOL,因此我无法解析EOL字符的Readline()字符串。下面的代码给出了我尝试执行的示例:C# 确定平面文件中的下线字符,c#,eol,C#,Eol,我试图识别给定的.txt或.csv平面文件中的下线字符。根据平面文件中第一行数据的EOL字符,我希望相应地处理该文件中的数据(我正在使用Bulk Load在SQL Server上创建表,需要将EOL传递给Bulk Load命令)。据我所知,Readline()自动处理EOL,因此我无法解析EOL字符的Readline()字符串。下面的代码给出了我尝试执行的示例: int EOLChar_CRLF = 0; int EOLChar_LF = 0; int EOLChar_CR = 0; int E
int EOLChar_CRLF = 0;
int EOLChar_LF = 0;
int EOLChar_CR = 0;
int EOLChar_Hex = 0;
string eol_line = file2.ReadLine();
MessageBox.Show(eol_line);
EOLChar_CRLF = eol_line.IndexOf("\\r\\\n");
EOLChar_LF = eol_line.IndexOf("\\n");
EOLChar_CR = eol_line.IndexOf("\\r");
EOLChar_Hex = eol_line.IndexOf("\\0x0a");
MessageBox.Show("CRLF is line feed if " + EOLChar_CRLF.ToString() + " <> -1");
MessageBox.Show("LF is line feed if " + EOLChar_LF.ToString() + " <> -1");
MessageBox.Show("CR is line feed if " + EOLChar_CR.ToString() + " <> -1");
MessageBox.Show("0x0a is line feed if " + EOLChar_Hex.ToString() + " <> -1");
int EOLChar\u CRLF=0;
int EOLChar_LF=0;
int EOLChar_CR=0;
int EOLChar_Hex=0;
字符串eol_line=file2.ReadLine();
MessageBox.Show(下线);
EOLChar\U CRLF=eol\U line.IndexOf(“\\r\\\n”);
EOLChar\u LF=eol\u line.IndexOf(“\\n”);
EOLChar\U CR=eol\U line.IndexOf(\\r”);
EOLChar\U Hex=eol\U line.IndexOf(\\0x0a”);
MessageBox.Show(“如果“+EOLChar_CRLF.ToString()+”-1”,则CRLF是换行符”;
Show(“如果“+EOLChar\u LF.ToString()+”-1”,则LF是换行符”;
Show(“如果“+EOLChar_CR.ToString()+”-1”,则CR是换行符”;
MessageBox.Show(“0x0a是换行符,如果“+EOLChar_Hex.ToString()+”-1”);
有人知道使用StreamReader.ReadLine()方法或其他方法确定EOL的方法吗?我只想读取数据的第一行,并对EOL进行分析,因为其中一些文件有2000多万行。确定文本文件行尾约定的通常方法是从文件开始处插入足够大的缓冲区并检查它。当然,缓冲区的大小在某种程度上取决于预期的行长度。您希望输入足够的数据以获得合理的行数 除了Windows(CR+LF)、Unix/Linux/OS X(LF)或老式MacOS(CR)之外,您不太可能遇到线端约定。就速度而言,很难打败这样的东西
public enum EndOfLineStyle
{
Unknown = 0 ,
CR = 1 ,
LF = 2 ,
CRLF = CR|LF ,
Unix = LF ,
MacOs = CR ,
Windows = CRLF ,
}
const int BUFFER_SIZE = 8192 ;
public EndOfLineStyle DetermineEndOfLineStyle( string pathToFile )
{
int bufl = 0 ;
char[] buf = new char[BUFFER_SIZE] ;
using ( StreamReader reader = File.OpenText( pathToFile ) )
{
bufl = reader.ReadBlock( buf , 0 , buf.Length ) ;
}
int crlfs = 0 ;
int crs = 0 ;
int lfs = 0 ;
for ( int i = 0 ; i < bufl ; )
{
if ( buf[i] == '\r' && i < bufl-1 && buf[i+1] == '\n' ) { ++crlfs ; i+=2 ; }
else if ( buf[i] == '\r' ) { ++crs ; i+=1 ; }
else if ( buf[i] == '\n' ) { ++lfs ; i+=1 ; }
}
EndOfLineStyle style ;
if ( crlfs > crs && crlfs > lfs ) style = EndOfLineStyle.Windows ;
else if ( lfs > crlfs && lfs > crs ) style = EndOfLineStyle.Unix ;
else if ( crs > crlfs && crs > lfs ) style = EndOfLineStyle.MacOs ;
else style = EndOfLineStyle.Unknown ;
return style ;
}
public enum EndOfLineStyle
{
未知=0,
CR=1,
LF=2,
CRLF=CR | LF,
Unix=LF,
MacOs=CR,
Windows=CRLF,
}
const int BUFFER_SIZE=8192;
公共EndOfLineStyle DetermineEndOfLineStyle(字符串路径文件)
{
int bufl=0;
char[]buf=新字符[缓冲区大小];
使用(StreamReader=File.OpenText(pathToFile))
{
bufl=reader.ReadBlock(buf,0,buf.Length);
}
int-crlfs=0;
int-crs=0;
int-lfs=0;
对于(int i=0;icrs&&crlfs>lfs)style=EndOfLineStyle.Windows;
如果(lfs>crlfs&&lfs>crs)style=EndOfLineStyle.Unix;
else if(crs>crlfs&&crs>lfs)style=EndOfLineStyle.MacOs;
else style=EndOfLineStyle.未知;
回归风格;
}
确定文本文件行尾约定的常用方法是从文件开始处插入足够大小的缓冲区,并对其进行检查。当然,缓冲区的大小在某种程度上取决于预期的行长度。您希望输入足够的数据以获得合理的行数
除了Windows(CR+LF)、Unix/Linux/OS X(LF)或老式MacOS(CR)之外,您不太可能遇到线端约定。就速度而言,很难打败这样的东西
public enum EndOfLineStyle
{
Unknown = 0 ,
CR = 1 ,
LF = 2 ,
CRLF = CR|LF ,
Unix = LF ,
MacOs = CR ,
Windows = CRLF ,
}
const int BUFFER_SIZE = 8192 ;
public EndOfLineStyle DetermineEndOfLineStyle( string pathToFile )
{
int bufl = 0 ;
char[] buf = new char[BUFFER_SIZE] ;
using ( StreamReader reader = File.OpenText( pathToFile ) )
{
bufl = reader.ReadBlock( buf , 0 , buf.Length ) ;
}
int crlfs = 0 ;
int crs = 0 ;
int lfs = 0 ;
for ( int i = 0 ; i < bufl ; )
{
if ( buf[i] == '\r' && i < bufl-1 && buf[i+1] == '\n' ) { ++crlfs ; i+=2 ; }
else if ( buf[i] == '\r' ) { ++crs ; i+=1 ; }
else if ( buf[i] == '\n' ) { ++lfs ; i+=1 ; }
}
EndOfLineStyle style ;
if ( crlfs > crs && crlfs > lfs ) style = EndOfLineStyle.Windows ;
else if ( lfs > crlfs && lfs > crs ) style = EndOfLineStyle.Unix ;
else if ( crs > crlfs && crs > lfs ) style = EndOfLineStyle.MacOs ;
else style = EndOfLineStyle.Unknown ;
return style ;
}
public enum EndOfLineStyle
{
未知=0,
CR=1,
LF=2,
CRLF=CR | LF,
Unix=LF,
MacOs=CR,
Windows=CRLF,
}
const int BUFFER_SIZE=8192;
公共EndOfLineStyle DetermineEndOfLineStyle(字符串路径文件)
{
int bufl=0;
char[]buf=新字符[缓冲区大小];
使用(StreamReader=File.OpenText(pathToFile))
{
bufl=reader.ReadBlock(buf,0,buf.Length);
}
int-crlfs=0;
int-crs=0;
int-lfs=0;
对于(int i=0;icrs&&crlfs>lfs)style=EndOfLineStyle.Windows;
如果(lfs>crlfs&&lfs>crs)style=EndOfLineStyle.Unix;
else if(crs>crlfs&&crs>lfs)style=EndOfLineStyle.MacOs;
else style=EndOfLineStyle.未知;
回归风格;
}
如果不知道行终止符是什么,如何确定第一行?听起来像是鸡和蛋的问题。你为什么想知道(或)关心分线器是什么?它将是\r
或\n
或两者都是(根据MSDN)ReadLine()
方法将处理该问题。ReadLine()自动处理终止符,这意味着不必确定ReadLine要运行的下线字符并提供第一行。我需要ReadLine()不显示的EOL字符,因为我必须将其作为参数传递到大容量Insert语句中。您的另一个选项是逐字符读取,查找预定义为EOL类型的内容。如果您不知道行终止符是什么,如何确定第一个“行”?听起来像是鸡和蛋的问题。你为什么想知道(或)关心分线器是什么?它将是\r
或\n
或两者都是(根据MSDN)ReadLine()
方法将处理这个问题。ReadLine()自动处理终止符,这意味着不需要确定ReadLine要运行的下线字符,也不需要确定p