2015-08-26 88 views

回答

0
Dim distdt As DataTable = dt.DefaultView.ToTable(True, "UserID") 

    For Each row In distdt.Rows 

     Using sw As StreamWriter = New StreamWriter("C:\" + row.item(0).ToString + "_file.txt") 

      For Each dr In ds.Tables(0).Rows 
       If row.item(0).ToString = dr.item(0).ToString Then 
        sw.WriteLine(dr.Item(1)) 
       End If 
      Next 

     End Using 

    Next 
0

我寫在C#我的例子。如果你想在VB中看到它們,請考慮使用Telerik's Code Converter

未提供DataTable中的數據,因此我編寫了一個快速控制檯應用程序,該應用程序將創建DataTable並填充它以及創建文件,但前提是文件尚未針對給定的UserId創建。請注意,這僅限於單個執行上下文,否則您需要訪問文件系統並檢查具有特定名稱的現有文件。

我提供給大家參考代碼的兩個版本,一個不使用LINQ和一個帶。

我知道你的問題,你用一個新的StreamWriter和可能的內容寫入文件。這可以通過替換File.Create行或使用File.Create()返回的FileStream來完成。您可以通過刪除Dispose()調用來修改我的代碼以使用返回的FileStream。請確保自己手動調用Dispose(),或者更好地將它包裝在一個使用中。

沒有使用LINQ

using System; 
using System.Data; 
using System.IO; 

namespace UniqueFileNames 
{ 
    class Program 
    { 
     private const string UserIdColumnName = "UserId"; 
     private const string FilePath = "C:\\Example\\"; 
     static void Main(string[] args) 
     { 
      // Create table and add column 
      var sampleDataTable = new DataTable(); 
      sampleDataTable.Clear(); 
      sampleDataTable.Columns.Add("Id"); 
      sampleDataTable.Columns.Add(UserIdColumnName); 

      // Add some rows for sample data 
      AddData(sampleDataTable, 1); 

      // add the data again to prove we don't recreate a file for same userid (later) 
      AddData(sampleDataTable, 2); 

      // Create a directory to hold our files. Doing so at the root can cause permission issues 
      Directory.CreateDirectory(FilePath); 

      // This will store what UserIds have already had files created for them 
      var userIdsWhereFileHasAlreadyBeenCreated = new HashSet<string>();    

      // Loop through each row in our data table, generate the file name, display a mesage, and create the file 
      foreach (DataRow row in sampleDataTable.Rows) // another, cleaner option would be to select distinct UserIds from the Rows collection 
      { 
       var currentUserid = row[UserIdColumnName].ToString(); 
       var fileName = string.Format("{0}_File.txt", row[UserIdColumnName]); 

       // Check to see if this userId has already had a file created for this execution 
       if (!userIdsWhereFileHasAlreadyBeenCreated.Contains(currentUserid)) 
       { 
        Console.WriteLine(string.Format("Creating a file named {0} at location {1}", fileName, FilePath)); 
        File.Create(string.Format("{0}{1}", FilePath, fileName)).Dispose(); 

        // Add the UserId so that we do not try to create a file for this UserId again 
        userIdsWhereFileHasAlreadyBeenCreated.Add(currentUserid); 
       } 
       else // this UserId already had a file created for it during this execution 
       { 
        Console.WriteLine(string.Format("A file named {0} at location {1} already exists", fileName, FilePath)); 
       } 
      } 

      Console.ReadKey(); 
     } 

     private static void AddData(DataTable sampleDataTable, int iteration) 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       var row = sampleDataTable.NewRow(); 
       row[UserIdColumnName] = string.Format("user{0}", i); 

       // generate incremented Ids based on iteration to show duplicate values between rows for UserId 
       row["Id"] = i + (10 * iteration); 
       sampleDataTable.Rows.Add(row); 
      } 
     } 
    } 
} 

隨着使用LINQ

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.IO; 
using System.Linq; 

namespace UniqueFileNames 
{ 
    class Program 
    { 
     private const string UserIdColumnName = "UserId"; 
     private const string FilePath = "C:\\Example\\"; 
     static void Main(string[] args) 
     { 
      // Create table and add column 
      var sampleDataTable = new DataTable(); 
      sampleDataTable.Clear(); 
      sampleDataTable.Columns.Add("Id"); 
      sampleDataTable.Columns.Add(UserIdColumnName); 

      // Add some rows for sample data 
      AddData(sampleDataTable, 1); 

      // add the data again to prove we don't recreate a file for same userid (later) 
      AddData(sampleDataTable, 2); 

      // Create a directory to hold our files. Doing so at the root can cause permission issues 
      Directory.CreateDirectory(FilePath); 

      // We take the rows and select each row's UserId column and then to a Distinct() on that result. 
      // This gives us an IEnumerable<string> of distinct UserIds 
      // Loop through each row in our data table, generate the file name, display a mesage, and create the file 
      foreach (var currentUserId in sampleDataTable.Rows.OfType<DataRow>().Select(r => r[UserIdColumnName].ToString()).Distinct()) 
      { 
       var fileName = string.Format("{0}_File.txt", currentUserId); 
       Console.WriteLine(string.Format("Creating a file named {0} at location {1}", fileName, FilePath)); 
       File.Create(string.Format("{0}{1}", FilePath, fileName)).Dispose(); 
      } 

      Console.ReadKey(); 
     } 

     private static void AddData(DataTable sampleDataTable, int iteration) 
     { 
      for (int i = 0; i < 10; i++) 
      { 
       var row = sampleDataTable.NewRow(); 
       row[UserIdColumnName] = string.Format("user{0}", i); 

       // generate incremented Ids based on iteration to show duplicate values between rows for UserId 
       row["Id"] = i + (10 * iteration); 
       sampleDataTable.Rows.Add(row); 
      } 
     } 
    } 
} 
+0

@sqllayman沒這個幫助你嗎?你需要任何其他信息或任何東西? – Dotarp

+0

我使用了2個不同的數據表,其中1個獲得ID(dt1)的唯一列表,然後是For Each dt1 ...使用Writer ...對於每個dt2如果dt1.ID = dt2.ID,那麼寫入工作相當好... –

+0

感謝您跟進!對不起,如果我的回答不是你要找的。 – Dotarp

相關問題