如何从列分隔的数据集到逗号分隔的数据集?
Posted
技术标签:
【中文标题】如何从列分隔的数据集到逗号分隔的数据集?【英文标题】:How from Columns separated dataset, to a comma separated one? 【发布时间】:2019-06-27 04:28:10 【问题描述】:我需要将我的数据集的列分隔成逗号分隔我如何做到这一点?我需要一个如下所示的数据集:
@VBasic2008 这是我在工作表中间得到的:第一行和第二行是我对你的函数 CONCAT 的尝试。虽然我需要像图像最右边的部分......像6,40,45,52。并非所有值都合并了..
所以我使用了 CONCAT 函数,但我必须手动计算每一列,我展示了最终需要帮助的列(注意我使用的是;而不是,因为我的 excel 似乎无法使用,)
这是最终的输出
好的,但是如果我有一个包含 1000 列的数据集怎么办?这个过程需要比这快得多。这没有优化。
【问题讨论】:
您的意思是您有一个 Excel 电子表格,其中您的数据被分隔成列,并且您想将其转换为逗号分隔值?如果这是您的意图,您可以将其保存为 .csv 文件格式。您可以通过转到文件 --> 另存为 --> 选择文件格式为任何 CSV 来执行此操作,即 CSV UTF-8 (.csv)。那么你应该得到你想要的。 我试过这个,设置 csv 用逗号文件分隔,但是当我打开文件时它看起来一样.. Excel 尝试猜测数据结构并通过文件扩展名将逗号分隔的值转换为列。如果您不希望将数据转换为列,您只需将文件扩展名从 .csv 重命名为 .txt 即可。然后用 Excel 打开磁贴,你肯定会得到你想要的。 你用的是什么版本的excel?Textjoin
这样做
我有 2016 年的
【参考方案1】:
如果您正在寻找公式解决方案
TEXTJOIN(", ", TRUE, Range)
其中Range
是预期值的列跨度
Option Explicit
Sub CSV()
Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets("Sheet1")
Dim LR As Long, xRow As Range
LR = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
Application.ScreenUpdating = False
For Each xRow In ws.Range("A1:A" & LR)
xRow.Offset(0, 6).Value = WorksheetFunction.TextJoin(", ", True, xRow.Resize(1, 6))
Next xRow
Application.ScreenUpdating = True
End Sub
【讨论】:
【参考方案2】:我已经就您的问题写了几篇 cmet,这可能很难理解。所以我决定做一个完整的解决方案,这实际上是一个技巧。
请注意,如果文件以.csv
(扩展名)为后缀,Microsoft Excel 会尝试猜测文件内容的数据结构。因此,每当您打开 .csv
文件时,您都会在列中获取数据,而不是 a single columns
和 comma separated values
。
为了达到您想要的效果,首先,将您的数据保存为逗号分隔值 (.csv
) 文件格式。
然后将您的文件扩展名从.csv
更改为,即.txt
(文本文件),例如:
如果您的文件名为“data.csv”,请将其更改为“data.txt”。请确保在更改文件扩展名之前看到csv
,因为在某些情况下您看不到文件扩展名;因此,当您重命名它时,它仍然是一个 csv
文件。
注意:如果您没有看到文件扩展名,如果您使用的是 Microsoft Windows,请关注此link。
将文件重命名为 txt 文件格式后,您可以在 Excel 应用程序中打开它,方法是转到 File -> Open ->
,然后浏览 txt
文件。
你去那里得到你想要的。
您不需要编写代码或使用任何函数来实现这一点,但如果您愿意,您可以选择这样做,因为这也是一个很好的解决方案。
【讨论】:
【参考方案3】:这已经用逗号分隔,因此您只需将其重命名为.csv
文件。
在 Windows 资源管理器中,转到功能区并转到“查看”选项卡并启用“文件扩展名”。 导航到您的文件,右键单击并将其重命名为 THEFILENAME.csv 而不是 THEFILENAME.xlsx
现在当你在 excel 中打开它时,它应该有网格。
【讨论】:
我需要一个看起来像我发布的图片中的文件,我拥有的文件有列而不是逗号【参考方案4】:文件的扩展名是什么? .xls、.txt 还是 .csv?
如果是 .xls 文件,您只需在 Excel 中打开文件,然后使用文件->另存为菜单,然后从文件类型下拉菜单中选择逗号分隔。
如果文件具有 .csv 扩展名并且您尝试在 Excel 中打开它,那么即使文件中有逗号,您也会看到列。要验证文件是否以逗号分隔,只需使用记事本或其他文本编辑器打开即可查看逗号分隔值。
如果有任何其他分隔符,如冒号 : 或其他,并且想用逗号替换,那么只需使用记事本中的查找和替换选项。
【讨论】:
我的原始文件是一个 .xlsx 我将它转换为一个 .csv 文件,但我总是在列中可视化我的数据集。我怎样才能做到这一点?谢谢【参考方案5】:CONCAT Excel UDF
这是我不久前写的。 在 VBE 中添加一个模块并将以下代码复制到其中。
代码
'*******************************************************************************
' Purpose: Concatenates the values of cells of a specified range.
' Read only. String.
' Syntax: CONCAT(Range, Separator, Row0Column1)
' Inputs:
' Range A valid range in any open workbook. Required.
' Separator A string to be used as a separator between the values.
' Default is the space character. Optional.
' Row0Column1 If 0 it concatenates by row, if 1 then by column.
' Default is 0. Optional.
' Returns: A string containing all the values of the specified range.
'*******************************************************************************
Function CONCAT(ByVal Range As Range, Optional Separator As String = _
" ", Optional Row0Column1 As Long = 0) As String
'***************************************
' Variables
Dim xdRowStart As Long, xdRowEnd As Long, xdRowCounter As Long
Dim xdColumnStart As Long, xdColumnEnd As Long, _
xdColumnCounter As Long
Dim xdSep As String, xdString As String, xdCheckEmptyString As String
Dim xdWS As Worksheet
'***************************************
' Values
xdString = ""
xdSep = Separator
Set xdWS = Range.Worksheet
xdRowStart = Range.Row
xdRowEnd = xdRowStart + Range.Rows.count - 1
xdColumnStart = Range.Column
xdColumnEnd = xdColumnStart + Range.Columns.count - 1
'***************************************
' Determine concatenated direction: by row or by column
Select Case Row0Column1
Case 0
GoTo ConcatenateByRow
Case 1
GoTo ConcatenateByColumn
Case Else
MsgBox "Row0Column1:" & vbCr _
& "Ommit or use 0 for Concatenating by Row." & vbCr _
& "Use 1 for Concatenating by Column."
GoTo ConcatenateFinal
End Select
'***************************************
' Concatenate by Row:
ConcatenateByRow:
For xdRowCounter = xdRowStart To xdRowEnd
For xdColumnCounter = xdColumnStart To xdColumnEnd
If xdString = "" Then 'xdString is empty; all cells were empty so far
xdCheckEmptyString = xdWS.Cells(xdRowCounter, xdColumnCounter)
If xdCheckEmptyString <> "" Then 'Cell is not empty
xdString = xdCheckEmptyString
End If
Else 'xdString is not empty
xdCheckEmptyString = xdWS.Cells(xdRowCounter, xdColumnCounter)
If xdCheckEmptyString <> "" Then 'Cell is not empty
xdString = xdString & xdSep & xdCheckEmptyString
End If
End If
Next xdColumnCounter
Next xdRowCounter
GoTo ConcatenateFinal
'***************************************
' Concatenate by Column:
ConcatenateByColumn:
For xdColumnCounter = xdColumnStart To xdColumnEnd
For xdRowCounter = xdRowStart To xdRowEnd
If xdString = "" Then 'xdString is empty; all cells were empty so far
xdCheckEmptyString = xdWS.Cells(xdRowCounter, xdColumnCounter)
If xdCheckEmptyString <> "" Then 'Cell is not empty
xdString = xdCheckEmptyString
End If
Else 'xdString is not empty
xdCheckEmptyString = xdWS.Cells(xdRowCounter, xdColumnCounter)
If xdCheckEmptyString <> "" Then 'Cell is not empty
xdString = xdString & xdSep & xdCheckEmptyString
End If
End If
Next xdRowCounter
Next xdColumnCounter
GoTo ConcatenateFinal
'***************************************
ConcatenateFinal:
CONCAT = xdString
End Function
'*******************************************************************************
在 Excel 中的使用
=CONCAT($A1:$G1,",")
并复制下来:
=CONCAT($A2:$G2,",")
【讨论】:
我试过这个,但它给了我合并列的所有值,而我需要有相同的列结构但用逗号分隔,所以我可以使用这个像 R 这样的程序中的数据集。我更新了我的帖子,让你看看我使用 CONCAT 有什么以上是关于如何从列分隔的数据集到逗号分隔的数据集?的主要内容,如果未能解决你的问题,请参考以下文章