簡體   English   中英

C#腳本將txt文檔的第一行轉換為SQL Server的創建表語句

[英]C# script to convert first line of txt document into a create table statement for SQL Server

因此,每當我需要分析一個新的文本文件時,我就不得不使用導入向導從一個新的TXT選項卡分隔的文件中創建一個表,這讓我感到厭煩。 我所做的大部分工作都是粗略的數據分析,但是我對訪問SQL感到厭倦,並且文檔有時足夠大,以至於Excel分析不會削減它。 我還沒有找到一種將多個文件中的數據快速導入SQL Server的好方法。 我知道批量導入 ,但是據我所知,您需要一個已經制成的表格才能使用它。 我的文本文件總是不同的,所以我不能只創建一個通用表並重新創建它。

我正在編寫一個C#代碼,希望最終將獲得一個文件路徑,並復制該路徑中每個文本文件的副本,並將其切成每個文檔的第一個{CR} {LF},定義我的定界符'\\ t'', ''|' 等等,並為路徑中的每個文件創建一個create table語句。 我想這樣做,然后就可以對每個文件進行簡單的批量導入並完成。

這是我到目前為止的內容:我正在嘗試使其在單個選項卡定界文件中工作

private void button4_Click(object sender, EventArgs e)
    {

        string pathOfFile = textBox2.Text;
        string origFileText = File.ReadAllText(pathOfFile);
        int intIndexofCRLF = origFileText.IndexOf(Environment.NewLine);
        string strIndexfCRLF = intIndexofCRLF.ToString();
        string strJustHeader = origFileText.Substring(0, intIndexofCRLF);
        string[] splitarray = strJustHeader.Split('\t');
        string tablename = textBox3.Text;
        string SQLPart1 = "CREATE TABLE " + tablename + "( ";
        string sqlbody = "";
        for (int i = 0; i < splitarray.Length; i++)
        {
            sqlbody = sqlbody + "[" + splitarray[i] + "] " + "varchar(255), " ;

        }
        string SQLpart2 = sqlbody.Substring(0, sqlbody.Length - 1); 
        string SQLPart3 = ");"
        MessageBox.Show(SQLPart1 + SQLPart2 + SQLPart3);
    }

由於某種原因,執行此操作時我的陣列混亂了。

我的輸入是D:\\ newtext.txt

abd abc ans azd

1 2 3 4

我想要的輸出是

創建表newtext(abd varchar(255),abc varchar(255),ans varchar(255),azd varchar(255));

謝謝您的幫助!

我將在此代碼中改進幾件事:

  1. StringBuilders比連接字符串更有效,您應該使用它們
  2. 同時處理窗口(“ \\ r \\ n”)和Unix(“ \\ n”)行。
  3. 從磁盤僅讀取文件的第一行,而不是將所有文件讀取到內存,然后從中獲取第一行

以下是包含這些改進的示例代碼:

string tableName = "myTable";
string delimeter = " ";
string line = null;
using (Stream stream = File.OpenRead("FilePath"))
using (StreamReader sr = new StreamReader(stream))
{
    line = sr.ReadLine();
}
string fileHeader = line.Replace("\r", string.Empty).Replace("\n", string.Empty);
string[] fileHeaderSegments = fileHeader.Split(new string[] { delimeter }, StringSplitOptions.None);
StringBuilder sb = new StringBuilder(string.Format("CREATE TABLE {0} (", tableName));
for (int i = 0; i < fileHeaderSegments.Length; i++)
{
    if (i != 0)
    {
        sb.Append(",");
    }
    sb.Append(fileHeaderSegments[i]);
    sb.Append(" varchar(255)");
}
sb.Append(");");
Console.WriteLine(sb.ToString());
Console.ReadKey();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM