我寫在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);
}
}
}
}
@sqllayman沒這個幫助你嗎?你需要任何其他信息或任何東西? – Dotarp
我使用了2個不同的數據表,其中1個獲得ID(dt1)的唯一列表,然後是For Each dt1 ...使用Writer ...對於每個dt2如果dt1.ID = dt2.ID,那麼寫入工作相當好... –
感謝您跟進!對不起,如果我的回答不是你要找的。 – Dotarp